OAuth 2 令牌只是随机的 blob。我已经看到 OAuth 服务器的实现似乎建议将此随机字符串直接存储在数据库中并进行查找。
这违背了我更好的判断。
令牌本质上是用户的另一个密码。将这些令牌以纯文本形式存储在数据库中——即使这些密码是随机生成的——似乎是个坏主意。这是因为如果数据库遭到破坏,那么攻击者所要做的就是通过auth_token=code
并冒充任何具有有效令牌的用户。
为 OAuth 2 生成和存储授权令牌的最佳方法是什么?
就像拥有一个易于撤销的不透明令牌的想法一样。但我想保持 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
andsecret_key
并将其作为auth_code
验证
auth_code
成组件random_index
secret_key
random_index
在数据库中查找令牌secret_key
发行期间使用散列方法。我认为以上解决了问题,但我欢迎任何其他解决方案。
注意:我会将其他元数据与密钥(到期、权限等)一起存储,但这对于回答问题并不重要。
注意 2:我也可以使用 SHA2 或其他快速散列算法而不是scrypt
或者bcrypt
因为我控制secret_key
.