我知道 OAuth 规范并没有指定 ConsumerKey、 ConsumerSecret、 AccessToken、 RequestToken、 TokenSecret 或者 Verifier 代码的来源,但我很好奇是否有创建显著安全令牌(特别是令牌/秘密组合)的最佳实践。
在我看来,有几种创建标记的方法:
优点(1)是数据库是信息的唯一来源,似乎是最安全的。对它进行攻击比对(2)或(3)更难。
散列实数据(2)将允许从大概已知的数据重新生成令牌。可能不会真正为(1)提供任何优势,因为无论如何都需要存储/查找。CPU 密集程度高于(1)。
加密真实数据(3)将允许解密知道信息。与(1)和(2)相比,这将需要更少的存储和更少的查找,但是潜在的安全性也更低。
是否应考虑其他方法/优点/缺点?
编辑: 另一个考虑因素是令牌中必须存在某种随机值,因为必须存在过期和重新发行新令牌的能力,所以它不能只包含真实数据。
跟进问题 :
是否有一个最小令牌长度来显著加密安全?据我所知,更长的令牌机密将创建更安全的签名。这个理解正确吗?
从散列的角度来看,使用特定的编码比使用另一种编码有什么优势吗?例如,我看到许多 API 使用十六进制编码(例如 GUID 字符串)。在 OAuth 签名算法中,令牌用作字符串。使用十六进制字符串时,可用的字符集将比使用 Base64编码时小得多(更可预测)。在我看来,对于两个长度相等的字符串,字符集较大的字符串具有更好/更宽的散列分布。在我看来,这将提高安全性。这个假设正确吗?
OAuth 规范在 11.10秘密熵中提出了这个问题。