为了访问web服务应用程序中的资源,客户端应用程序需要为每个资源提供唯一的共享机密。
问题是:SecureRandom生成的Long是否合理安全(例如,针对暴力攻击)?还是应该使用UUID?
web服务运行在HTTPS上,我可以保证不会发生冲突(与Long或UUID)。真正的问题只是Java中Long的域是否足够大,以提供针对HTTPS的详尽攻击的保护。
简单的答案是,你永远不能保证随机生成的数字对/序列不会发生任何冲突。您所能做的就是设计一些东西,使应用程序发生碰撞的概率可以接受的较低。这个概率需要有多低取决于应用程序的细节。
让我困惑的是,为什么碰撞会成为共享秘密的问题。你真的在问有人猜测共同秘密的可能性吗?
好的,这是一道简单的数学题。以long
为例。
- 存在CCD_ 3的CCD_ 2的可能值
- 关于
V
,这些都是"有效的秘密" - 某个坏人可能会在每秒尝试
N
猜测的秘密 - 你可以推导出一个概率
P
的公式,某人可以在给定的时间间隔T
内猜到你的一个秘密
导出公式,插入变量V
、N
和T
,并确定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加密文本现在是密文。希望有帮助。。。