0

我有一个 API,设备对其进行身份验证以接收有时间限制的身份验证令牌。这些设备将有一个“记住我的密码”复选框,因此此身份验证可以自动进行。

我不会在设备上以明文形式存储用户密码。

我不能让令牌过期时间长,因为这些设备是展示性的和面向客户的。最终,令牌将在与客户一起使用期间过期,并且设备将无法发出请求或必须弹出身份验证对话框。对此有可接受的解决方法(例如,令牌持续 2 天;每天早上都需要重新授权),但我首先想看看避免将这种复杂性暴露给设备的选项。

我想尝试在设备上以加盐和散列形式1存储密码。此散列密码将在身份验证请求中提交。在服务器端,API 身份验证依赖于 Django 的 contrib.auth。传统的密码工作流程是对请求密码进行哈希处理,并将其与存储的哈希值进行比较。因为我有一个已经散列的请求密码,所以在比较之前我需要重新散列存储的密码。

我尝试了这个解决方案,但似乎需要修改每个密码哈希。我仍然需要在网站的非 API 部分支持标准密码验证,所以我最终会为我想使用的每个哈希算法加倍哈希:BCryptPasswordHasher/PreHashedBCryptPasswordHasher等等。虽然我现在只想使用一个,但它是我不想让其他开发人员在尝试添加或更改哈希时必须弄清楚这种情况。

实现“预散列”的另一个选择是修改 django.contrib.auth,但我不希望维护它的一个分支。

我确定其他人之前已经解决了这个问题。我正在寻找关于如何在不削弱常规比较的情况下找到一个点来影响预哈希密码比较的具体建议,以及关于一般解决方案的建议。如果您有解决安全问题且明智的替代方法,我将很高兴听到它。

干杯

  1. 这不会阻止有权访问哈希的顽皮人针对 API 进行身份验证,但它会保护在许多网站上使用同一个密码的用户不会被更广泛地暴露。
4

1 回答 1

1

让我看看我是否理解你的意图。您有一个 API,您可以使用 Tokens 对其进行身份验证。Token 是在会话开始时通过密码认证获得的。您希望启用一种“记住”密码的方法,这样用户就不必每次都登录,如果这是他们喜欢的方式,但您不想在设备中以纯文本形式存储密码。那是对的吗?

如果用户选择“记住我”,最简单的方法是使令牌永久化或有很长的有效期。这样,您可以在设备上存储一种不是密码的身份验证形式。

只要您还执行以下操作,这应该可以正常工作:

  • 当用户更改密码时,使服务器端的所有令牌失效。
  • 为每个设备生成令牌,向用户提供使用可在其个人资料中撤销的令牌的应用程序列表。

如果您使用双哈希密码,无论如何您基本上都是在创建一个令牌,但更糟糕的是因为它与密码相关联,如果令牌被泄露,则必须更改密码。

于 2013-03-06T02:15:37.857 回答