我知道OAuth规范没有具体说明ConsumerKey、ConsumerSecret、AccessToken、RequestToken、TokenSecret或Verifier代码的来源,但我想知道创建显著安全令牌(特别是Token / Secret组合)的最佳实践是否存在。
在我看来,创建令牌有几种方法:
- 只使用随机字节,在数据库中存储并与消费者/用户相关联
- 散列一些用户/消费者特定数据,并将其与消费者/用户相关联后存储在数据库中
- 加密用户/消费者特定数据
使用随机字节的优点(1)是数据库是信息的唯一来源,这似乎是最安全的。比(2)或(3)更难受到攻击。
对真实数据进行哈希(2)可以重新生成令牌,前提是已经知道了该数据。可能不会真正为(1)提供任何优势,因为需要存储/查找。比(1)更耗费CPU资源。
加密真实数据(3)将允许解密以获取信息。这将比(1)和(2)具有更少的存储量和潜在的较少查找次数,但可能不够安全。
还有其他的方法/优点/缺点应该考虑吗?
编辑:另一个考虑因素是令牌中一定要有某种随机值,因为必须存在过期并重新发放新令牌的能力,因此它不能仅由真实数据组成。
后续问题:
是否有最小的令牌长度可以显著加密?据我所知,较长的令牌秘钥将创建更安全的签名。这个理解正确吗?
从散列的角度来看,使用特定编码是否比其他编码更有优势?例如,我看到很多API使用十六进制编码(例如GUID字符串)。在OAuth签名算法中,Token被用作字符串。使用十六进制字符串,可用字符集将比Base64编码小得多(更可预测)。对于长度相等的两个字符串,具有较大字符集的字符串会有更好/更广泛的哈希分布。这似乎会提高安全性。这个假设正确吗?
OAuth规范在11.10 Entropy of Secrets中提出了这个问题。