4

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

问题是:SecureRandom 生成的多头对于此目的是否合理安全(例如针对暴力攻击)?还是应该改用 UUID?

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

4

2 回答 2

2

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

让我感到困惑的是,为什么冲突会成为共享秘密的问题。你真的在问有人猜到共享秘密的概率吗?


好的,这是一道简单的数学题。举个long例子。

  • a有2^64可能的值long
  • 这些V都是“有效的秘密”。
  • 一些坏人N每秒可以合理地尝试猜测的秘密。
  • 您可以推导出一个公式来计算P在给定时间间隔内有人可以猜出您的某个秘密的概率T

推导公式,插入变量和V,然后决定是否可以接受。NTP

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

于 2013-02-19T07:49:19.913 回答
1

也许吧,但是当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 加密文本现在是密文。希望有帮助...

于 2013-02-19T07:35:24.267 回答