java - java.lang.Long 或 java.util.UUID 是安全的共享 secret 吗?

标签 java long-integer uuid shared-secret

为了访问我的 Web 服务应用程序中的资源,客户端应用程序需要为每个资源提供唯一的共享 key 。

问题是:由 SecureRandom 生成的 Longs 是否为此目的合理安全(例如,抵御暴力攻击)?或者我应该改用 UUID?

Web 服务通过 HTTPS 运行,我可以保证不会发生冲突(与 Long 或 UUID)。真正唯一的问题是 Java 中 Long 的域是否足够大以提供针对 HTTPS 的穷举攻击的保护。

最佳答案

简单的答案是,您永远无法保证随机生成的数字对/序列不会发生任何冲突。您所能做的就是设计一些东西,使碰撞的概率对于应用程序来说是可以接受的低。该概率需要多低取决于应用程序的细节。

令我困惑的是,为什么碰撞会成为共享 secret 的问题。您真的是在问有人猜到共享 secret 的概率吗?


好的,这是一道简单的数学题。以 long 为例。

  • long2^64 个可能的值。
  • 其中大约 V 是“有效 secret ”。
  • 一些坏人可能每秒尝试 N 个猜测的 secret 。
  • 您可以推导出一个公式,用于计算某人在给定时间间隔 T 内猜出您的其中一个 secret 的概率 P

推导公式,代入变量VNT,判断P是否为可以接受。

请注意,“实际相关机会”不是我们可以建议的。相反,应该根据对成功破坏您计划的人的成本/后果的分析来决定什么是可接受的风险。

关于java - java.lang.Long 或 java.util.UUID 是安全的共享 secret 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14951990/

相关文章:

java - 初始化长数

c++ - 如何生成 24 个字符的 UUID?

python - 带有 uuid 字段的 Django 迁移会生成重复值

java 循环与 Integer.MAX_VALUE

java - 现有 list (构建错误)

java - 使用编译器从 Java 到机器代码

java - 为什么此 URL 从 Tomcat 返回错误 400?

C++ 将 int 转换为 *LONG

java - java api中的UUID和碰撞

Java进程构建器: environment set correctly but still command not found