4

Web サービス アプリケーションのリソースにアクセスするには、クライアント アプリケーションは各リソースに固有の共有シークレットを提供する必要があります。

質問: SecureRandom によって生成された Long は、この目的 (例: ブルート フォース攻撃に対して) に対して合理的に安全ですか? または、代わりに UUID を使用する必要がありますか?

Web サービスは HTTPS で実行され、(Long または UUID との) 衝突が発生しないことを保証できます。問題は、Java の Long のドメインが、HTTPS を介した徹底的な攻撃に対する保護を提供するのに十分な大きさであるかどうかだけです。

4

2 に答える 2

2

簡単な答えは、ランダムに生成された数値ペア/シーケンスに衝突がないことを決して保証できないということです。できることは、アプリケーションにとって衝突の可能性が許容できるほど低くなるように設計することだけです。その確率をどの程度低くする必要があるかは、アプリケーションの詳細によって異なります。

これについて私を困惑させているのは、なぜ衝突が共有秘密の問題になるのかということです。誰かが共有秘密を推測する確率について本当に質問していますか?


わかりました、これは簡単な数学の問題です。例を見てみましょうlong

  • 2^64の可能な値がありますlong
  • これらの約Vは「有効な秘密」です。
  • 一部の悪者はN、1 秒ごとに推測された秘密をもっともらしく試すことができます。
  • P与えられた時間内に誰かがあなたの秘密の 1 つを推測できる確率の式を導き出すことができますT

式を導出し、変数VNおよびを代入して、許容できるTかどうかを判断します。P

「実際に関連する可能性」は、私たちがアドバイスできるものではないことに注意してください. むしろ、誰かがあなたのスキームを破ることに成功した場合のコスト/結果の分析に基づいて、許容できるリスクを決定する必要があります

于 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 で暗号化されたテキストは現在 cipherText にあります。それが役に立ったことを願っています...

于 2013-02-19T07:35:24.267 に答える