2013-02-25 64 views
3

OAuth 2令牌只是随机的斑点。我已经看到OAuth服务器的实现似乎建议将这个随机字符串直接存储在数据库中并查找它。作为一个OAuth服务器,我应该如何生成和存储OAuth 2.0令牌?

这违背了我的判断。

令牌本质上是用户的另一个密码。将这些令牌以纯文本形式存储在数据库中 - 即使这些密码是随机生成的 - 看起来像是坏主意。这是因为如果数据库受到攻击,那么攻击者所要做的就是通过auth_token=code并冒充任何具有有效令牌的用户。

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

回答

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使用密码散列最佳实践,并将其存储下db中的random_index
  3. 加密random_indexsecret_key和它的客户机auth_code提供给客户机作为auth_code

验证

  1. 解密成random_indexsecret_key部件
  2. 通过random_index查找令牌在数据库中
  3. 在签发期间使用散列方法验证secret_key

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

注意:我会存储其他元数据连同密钥(过期,权限等..),但这不重要的是回答这个问题。

注2:我也可以摆脱使用SHA2或另一种快速的哈希算法,而不是scryptbcrypt,因为我控制secret_key熵。

+0

这看起来可行。但是,您可能能够摆脱'random_index'并通过其他方式查找令牌(例如,存储诸如'client_id'和'user_id'等元数据以及令牌并将其用于查找)。 – 2013-12-30 18:01:15