为了访问我的 Web 服务应用程序中的资源,客户端应用程序需要为每个资源提供唯一的共享密钥。
问题是:SecureRandom 生成的多头对于此目的是否合理安全(例如针对暴力攻击)?还是应该改用 UUID?
Web 服务通过 HTTPS 运行,我可以保证不会发生冲突(使用 Long 或 UUID)。真正唯一的问题是Java中的Long的域是否足够大以提供针对HTTPS的详尽攻击的保护。
为了访问我的 Web 服务应用程序中的资源,客户端应用程序需要为每个资源提供唯一的共享密钥。
问题是:SecureRandom 生成的多头对于此目的是否合理安全(例如针对暴力攻击)?还是应该改用 UUID?
Web 服务通过 HTTPS 运行,我可以保证不会发生冲突(使用 Long 或 UUID)。真正唯一的问题是Java中的Long的域是否足够大以提供针对HTTPS的详尽攻击的保护。
简单的答案是,您永远无法保证随机生成的数字对/序列不会发生任何冲突。您所能做的就是设计一些东西,使应用程序发生冲突的可能性低到可以接受的程度。该概率需要多低取决于应用程序的细节。
让我感到困惑的是,为什么冲突会成为共享秘密的问题。你真的在问有人猜到共享秘密的概率吗?
好的,这是一道简单的数学题。举个long
例子。
2^64
可能的值long
。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 加密文本现在是密文。希望有帮助...