java.lang.Long或java.util.UUID是安全的共享机密吗



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

问题是:SecureRandom生成的Long是否合理安全(例如,针对暴力攻击)?还是应该使用UUID?

web服务运行在HTTPS上,我可以保证不会发生冲突(与Long或UUID)。真正的问题只是Java中Long的域是否足够大,以提供针对HTTPS的详尽攻击的保护。

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

让我困惑的是,为什么碰撞会成为共享秘密的问题。你真的在问有人猜测共同秘密的可能性吗?


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

  • 存在CCD_ 3的CCD_ 2的可能值
  • 关于V,这些都是"有效的秘密"
  • 某个坏人可能会在每秒尝试N猜测的秘密
  • 你可以推导出一个概率P的公式,某人可以在给定的时间间隔T内猜到你的一个秘密

导出公式,插入变量VNT,并确定P是否可接受。

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

也许吧,但当JCE支持这个功能时,为什么要使用它们呢?

DHParameterSpec dhSkipParamSpec = new DHParameterSpec(skip1024Modulus, skip1024Base);
KeyPairGenerator aliceKpairGen = KeyPairGenerator.getInstance("DH", "BC");
aliceKpairGen.initialize(dhSkipParamSpec);
KeyPair aliceKpair = aliceKpairGen.generateKeyPair();
byte[] alicePubKeyEnc = aliceKpair.getPublic().getEncoded();
aliceKeyAgree = KeyAgreement.getInstance("DH", "BC");
aliceKeyAgree.init(aliceKpair.getPrivate());

//... obtaining Bob's Public Key
aliceKeyFac = KeyFactory.getInstance("DH", "BC");
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(bobPubKeyEnc);
bobPubKey = aliceKeyFac.generatePublic(x509KeySpec);
aliceKeyAgree.doPhase(bobPubKey, true);
SecretKey aliceAesKey = aliceKeyAgree.generateSecret("AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, aliceAesKey);
byte[] cipherText = cipher.doFinal(plaintext.getBytes());

您的AES加密文本现在是密文。希望有帮助。。。

最新更新