安全令牌的长度

Posted

技术标签:

【中文标题】安全令牌的长度【英文标题】:Length of a security token 【发布时间】:2011-11-10 02:36:58 【问题描述】:

我正在使用安全令牌来创建这样的不可猜测的 URL(16 字节,十六进制)

http://example.com/something/private/b5f8c21a628e12b39786fb8ef9561d31

令牌类似于共享密码:谁知道 URL 被允许访问资源。

安全随机值需要多少字节才能适用于安全 URL?

【问题讨论】:

您是否按 URL 的长度付款 :-)?可能不是……那么您使用的 32 个十六进制字符是完美的! :-) 这个令牌/URL的目的是什么? 如果你的 PRNG 很好,这应该足够长。我强烈建议使用种子良好的加密 PRNG。 我正在使用并信任 Java 的 SecureRandom。 【参考方案1】:

我最终得到了一个 64 位随机值,它被编码为 url-safe Base64。猜测正确令牌的可能性是1 / 2^64 等于1 / 18446744073709551616。这是一个令人印象深刻的数字,攻击者几乎不可能通过 http 请求找到正确的令牌。

网址现在看起来像这样:http://example.com/private/1oWYPiqO81k/

【讨论】:

添加此链接以供将来参考,因为它在此上下文中有些相关且值得了解:preshing.com/20110504/hash-collision-probabilities 还有这张表,关于不同编码中包含的熵en.wikipedia.org/wiki/Password_strength#Random_passwords 如果信息不敏感,可能就足够了。 OWASP,即使在 2006 年也推荐 最少 128 位会话标识符。我只是让您知道,因为在询问什么是好的令牌长度的问题中引用了您的答案,并且 64 位是不够的,除非您可以接受有人会猜到它们的可能性。 Python 实现可以使用secrets.token_urlsafe()【参考方案2】:

所有应用程序在某些时候都依赖于cryptographic nonce。毕竟这是一个会话 id 或 csrf 令牌值。这里的重要性在于,如果攻击者有 100 年的时间来破解它,那么该值有多长并不重要。现在 100 年是一段很长的时间,但你应该努力让你的设计能持续这么久。

cookie 和您的值之间的主要安全性区别在于 cookie 会过期并且每次使用都会更改。但实际上,应该不惜一切代价避免这个值。如果这用于身份验证,则依赖会话 ID,这就是它存在的原因。不要滚动你自己的会话。

【讨论】:

【参考方案3】:

例如 10 个 unicode 字符的 URL,实际上是不可能猜到的,因为令牌是 160 位长,因此有 2 ^ 160 个不同的可能 URL。但是,您不应该依赖类似的东西来保证安全性,而应该依赖经典的登录和身份验证

【讨论】:

从任意 unicode 字符构建 url 听起来是个坏主意。实际上,我不会超过 base64 中使用的大约 64 个不同的字符。

以上是关于安全令牌的长度的主要内容,如果未能解决你的问题,请参考以下文章

加密的自定义字段是一种安全的方式来存储Apex标注的有限生命期OAuth令牌吗?

在基于令牌的身份验证中使用刷新令牌是不是安全?

JWT 访问令牌和刷新令牌安全性

为啥刷新令牌更安全?如果刷新令牌也可能被盗,为啥我们还要使用它?

Steam登录后为啥要验证安全令牌

为 api 访问生成安全令牌