【问题标题】:As an OAuth Server, how should I be generating and storing OAuth 2.0 Tokens?作为 OAuth 服务器,我应该如何生成和存储 OAuth 2.0 令牌?
【发布时间】:2013-02-10 22:30:53
【问题描述】:

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

这违背了我更好的判断。

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

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

【问题讨论】:

    标签: oauth-2.0 security


    【解决方案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提供给客户端

    验证

    1. 将客户端auth_code解密为random_indexsecret_key组件
    2. 在数据库中通过random_index查找令牌
    3. 在发布过程中使用哈希方法验证secret_key

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

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

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

    【讨论】:

    • 这看起来可行。但是,您也许可以摆脱 random_index 并通过其他方式查找令牌(例如,将元数据(例如 client_iduser_id 与令牌一起存储并使用这些元数据进行查找)。
    猜你喜欢
    • 2013-06-13
    • 1970-01-01
    • 2022-09-28
    • 2018-06-25
    • 2012-01-28
    • 2014-07-09
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多