使用Django';s密码哈希器
我有一个API,设备根据该API进行身份验证以接收有时间限制的身份验证令牌。这些设备将有一个“记住我的密码”复选框,以便自动进行身份验证 我不打算在设备上以明文形式存储用户密码 我不能让代币到期时间过长,因为这些设备是代表性的,面向客户。最终,令牌将在客户使用期间过期,设备将无法发出请求或必须弹出身份验证对话框。对此有可接受的解决办法(例如,令牌持续2天;每天早上都需要重新授权),但我首先想看看避免将复杂性暴露在设备上的选项 我想尝试将密码存储在设备上的一个盐和散列格式1中。此哈希密码将在身份验证请求中提交。在服务器端,API身份验证依赖于Django的contrib.auth。传统的密码工作流是散列请求密码,并将其与存储的散列进行比较。因为我有一个已经散列的请求密码,所以我需要在比较之前重新散列存储的密码 我尝试了这个解决方案,但似乎需要修改每个密码哈希器。我仍然需要在站点的非API部分支持标准密码身份验证,因此对于我想要使用的每个哈希算法,我最终都会使用两个哈希器:使用Django';s密码哈希器,django,django-authentication,Django,Django Authentication,我有一个API,设备根据该API进行身份验证以接收有时间限制的身份验证令牌。这些设备将有一个“记住我的密码”复选框,以便自动进行身份验证 我不打算在设备上以明文形式存储用户密码 我不能让代币到期时间过长,因为这些设备是代表性的,面向客户。最终,令牌将在客户使用期间过期,设备将无法发出请求或必须弹出身份验证对话框。对此有可接受的解决办法(例如,令牌持续2天;每天早上都需要重新授权),但我首先想看看避免将复杂性暴露在设备上的选项 我想尝试将密码存储在设备上的一个盐和散列格式1中。此哈希密码将在身份验
BCryptPasswordHasher
/prehashedbcryptppasswordhasher
等等。虽然我现在实际上只想使用一个,我不想让另一个开发人员在尝试添加或更改哈希器时必须弄清楚这一场景
实现“预哈希”的另一个选项是修改django.contrib.auth,但我不希望维护它的分支
我相信其他人以前也解决过这个问题。我正在寻找关于如何找到一个单一点来进行预哈希密码比较而不削弱常规比较的具体建议,以及关于一般解决方案的建议。如果你有一个解决安全问题的明智的替代方法,我将很高兴听到
干杯
让我看看我是否理解你的意图。您有一个使用令牌进行身份验证的API。令牌在会话开始时通过密码身份验证获得。您希望启用一种“记住”密码的方法,以便用户不必每次登录(如果他们喜欢的话),但您不希望在设备中以纯文本形式存储密码。对吗 实现这一点的最简单方法是使令牌永久化,或者如果用户选择“记住我”,则令牌的有效期很长。这样,您就可以在设备上存储一种不是密码的身份验证形式 只要您还执行以下操作,这应该可以正常工作:
- 当用户更改密码时,使服务器端的所有令牌无效
- 为每个设备生成令牌,向用户提供使用令牌的应用程序列表,这些令牌可以在用户配置文件中撤销
如果你双重散列密码,你基本上是在创建一个令牌,但更糟糕的是,它链接到密码,如果令牌被泄露,密码将不得不更改。我很困惑-你提供的是一个有限时间令牌,但是您想允许用户存储密码散列,以避免显示用于获取新令牌的UI吗?听起来你好像在尝试添加第二个不可恢复的令牌。。那就太糟糕了。为什么不能延长令牌的时间限制?密码更改将“撤销”存储在设备上的哈希密码。你的后一个问题在我问题的第三段中提到。我不喜欢这种“永久记住我的密码”的东西,但这是客户想要做的权衡。如果你允许人们使用散列密码进行身份验证,那么散列密码实际上就变成了明文密码。通过公开一个可以使用散列进行身份验证的接口,您已经有效地将盐渍散列密码存储转换为明文密码存储,我认为这比在用户代理中存储一个明文密码更安全。是的,这是一个很好的观点@MichaelC.O'Connor。正如我在“脚注”中提到的,重点是防止盗用密码登录其他服务。呵呵,我看你已经接受了一个答案,基本上就是我上面的评论。密码更改并不是“撤销”任何东西,因为(A)用户几乎从不这样做,(b)它仍然是其他东西的密码(如您上面提到的)。您已经在sid上找到了它。我没有想到根据“记住我”的设置来改变有效期;我喜欢这个主意。使事情简单化,并明确安全性/便利性权衡。我本想让到期时间相对较短,但并没有将记住密码有效地取消这一点等同起来。如果没有人来回答“单一再灰化点”的问题,我会接受这个答案。虽然这可能是一个愚蠢的实现,但仍然是一个更具体的问题。真的,我应该学会只问一个问题!