为了访问我的 Web 服务应用程序中的资源,客户端应用程序需要为每个资源提供唯一的共享 key 。
问题是:由 SecureRandom 生成的 Longs 是否为此目的合理安全(例如,抵御暴力攻击)?或者我应该改用 UUID?
Web 服务通过 HTTPS 运行,我可以保证不会发生冲突(与 Long 或 UUID)。真正唯一的问题是 Java 中 Long 的域是否足够大以提供针对 HTTPS 的穷举攻击的保护。
最佳答案
简单的答案是,您永远无法保证随机生成的数字对/序列不会发生任何冲突。您所能做的就是设计一些东西,使碰撞的概率对于应用程序来说是可以接受的低。该概率需要多低取决于应用程序的细节。
令我困惑的是,为什么碰撞会成为共享 secret 的问题。您真的是在问有人猜到共享 secret 的概率吗?
好的,这是一道简单的数学题。以 long
为例。
long
有2^64
个可能的值。- 其中大约
V
是“有效 secret ”。 - 一些坏人可能每秒尝试
N
个猜测的 secret 。 - 您可以推导出一个公式,用于计算某人在给定时间间隔
T
内猜出您的其中一个 secret 的概率P
。
推导公式,代入变量V
、N
和T
,判断P
是否为可以接受。
请注意,“实际相关机会”不是我们可以建议的。相反,您应该根据对成功破坏您计划的人的成本/后果的分析来决定什么是可接受的风险。
关于java - java.lang.Long 或 java.util.UUID 是安全的共享 secret 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14951990/