OAuth 2令牌只是随机的blob。我已经看到OAuth服务器的实现似乎建议将这个随机字符串直接存储在数据库中并进行查找。
这违背了我更好的判断力。
令牌本质上是用户的另一个密码。将这些令牌以纯文本形式存储在数据库中 - 即使这些密码是随机生成的 - 似乎是错误想法。这是因为如果数据库遭到破坏,那么攻击者所要做的就是通过auth_token=code
并模拟任何拥有有效令牌的用户。
为OAuth 2生成和存储授权令牌的最佳方法是什么?
答案 0 :(得分:1)
就像拥有一个易于撤销的不透明令牌的想法一样。但我想保持O(1)查询时间。
假设密钥查找是O(1)我认为以下方案应该有效。
Client Auth Code Issued = Url64(ENC(random_index||secretkey) || HMAC)
Database Record = {KEY: random_index , VALUE: scrypt(secretkey)}
说明:
<强>发行强>
random_index
和secret_key
secret_key
并将其存储在数据库中的random_index
下。random_index
和secret_key
并以auth_code
<强>验证强>
auth_code
解密为random_index
和secret_key
组件random_index
查找令牌
secret_key
。我认为以上解决了这个问题,但我欢迎任何其他解决方案。
注意:我会将其他元数据与密钥(过期,权限等)一起存储,但这对回答问题并不重要。
注意2 :我可能还会使用SHA2或其他快速哈希算法而不是scrypt
或bcrypt
,因为我控制secret_key
中的熵