作为OAuth服务器,我应该如何生成和存储OAuth 2.0令牌?

时间:2013-02-25 17:27:33

标签: oauth-2.0 security

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

这违背了我更好的判断力。

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

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

1 个答案:

答案 0 :(得分: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个随机字符串,random_indexsecret_key
  2. 使用密码哈希最佳实践来散列secret_key并将其存储在数据库中的random_index下。
  3. 加密random_indexsecret_key并以auth_code
  4. 的形式将其提供给客户端

    <强>验证

    1. 将客户auth_code解密为random_indexsecret_key组件
    2. 在数据库
    3. 中按random_index查找令牌
    4. 在发布期间使用哈希方法验证secret_key
    5. 我认为以上解决了这个问题,但我欢迎任何其他解决方案。

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

      注意2 :我可能还会使用SHA2或其他快速哈希算法而不是scryptbcrypt,因为我控制secret_key中的熵