【问题标题】: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。

标签: security token access-token


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 从任意 unicode 字符构建 url 听起来是个坏主意。实际上,我不会超过 base64 中使用的大约 64 个不同的字符。
    猜你喜欢
    • 2016-08-18
    • 2018-11-12
    • 2015-08-17
    • 1970-01-01
    • 2017-09-24
    • 2017-03-28
    • 2012-08-01
    • 2011-10-29
    • 1970-01-01
    相关资源
    最近更新 更多