oauth-2.0 - 作为 OAuth 服务器,我应该如何生成和存储 OAuth 2.0 token ?

标签 oauth-2.0 security

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

这违背了我更好的判断。

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

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

最佳答案

喜欢拥有一个易于撤销的不透明 token 的想法。但我想保留 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查找token
  3. 在发行时使用哈希方法验证secret_key

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

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

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

关于oauth-2.0 - 作为 OAuth 服务器,我应该如何生成和存储 OAuth 2.0 token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15072754/

相关文章:

javascript - 适用于 Javascript 和 PHP 的预制 XSS 预防库

Android 谷歌 Oauth2 ContactService

java - 函数 isAssignableFrom 在服务器启动期间返回 false

Azure Web App .net core OpenID redirect_uri 问题

c# - AesManaged 的​​密码学设置和 secret 管理

C:在控制台中安全地输入和存储字符串的简单方法?

asp.net - ASP.NET网站管理工具:无法连接到SQL Server数据库

github - GitHub 上的 Oauth 2.0 客户端 key [CLI 应用程序]

java - Google Drive Android API OAuth 身份验证问题 - onActivityResult 返回 "0"

php - 使用 HTTP POST 登录表单