3

OAuth 2 令牌只是随机的 blob。我已经看到 OAuth 服务器的实现似乎建议将此随机字符串直接存储在数据库中并进行查找。

这违背了我更好的判断。

令牌本质上是用户的另一个密码。将这些令牌以纯文本形式存储在数据库中——即使这些密码是随机生成的——似乎是个坏主意。这是因为如果数据库遭到破坏,那么攻击者所要做的就是通过auth_token=code并冒充任何具有有效令牌的用户。

为 OAuth 2 生成和存储授权令牌的最佳方法是什么?

4

1 回答 1

1

就像拥有一个易于撤销的不透明令牌的想法一样。但我想保持 O(1) 查找时间。

假设关键查找是 O(1) 我认为以下方案应该有效。

 Client Auth Code Issued = Url64(ENC(random_index||secretkey) || HMAC)
 Database Record         = {KEY: random_index , VALUE: scrypt(secretkey)}

解释:

发行

  1. 生成 2 个随机字符串,arandom_indexsecret_key
  2. 散列使secret_key​​用密码散列最佳实践并将其存储random_index在数据库中。
  3. 加密random_indexandsecret_key并将其作为auth_code

验证

  1. 将客户端解密auth_code成组件random_indexsecret_key
  2. random_index在数据库中查找令牌
  3. 验证secret_key发行期间使用散列方法。

我认为以上解决了问题,但我欢迎任何其他解决方案。

注意:我会将其他元数据与密钥(到期、权限等)一起存储,但这对于回答问题并不重要。

注意 2:我也可以使用 SHA2 或其他快速散列算法而不是scrypt或者bcrypt因为我控制secret_key.

于 2013-02-25T17:27:33.383 回答