5

AndroidでJavaを使用してRSAキーペアを決定論的に生成しようとしています。私の要件は、キーペアを保存できないことであり、以前/将来の実行と同等になるように実行時に生成する必要があります。

私のプロセスは、決定論的に乱数ジェネレーターをシードし、そのジェネレーターを渡してキーを作成することでした。私のコードは次のとおりです。

SecureRandom random=SecureRandom.getInstance("SHA1PRNG");
random.setSeed(1234);   //something device specific will be used to set this
KeyPairGenerator keyGen=KeyPairGenerator.getInstance("RSA");
keyGen.initialize(1024, random);

KeyPair pair=keyGen.generateKeyPair();
PublicKey pub=pair.getPublic();
PrivateKey priv=pair.getPrivate();

結果のキーは、実行ごとに異なります。ただし、SecureRandomの数値は実行ごとに同じであり、デバイス間でも同じです。

私は何が欠けていますか?これらのキーを繰り返し生成するにはどうすればよいですか?

ありがとう

4

1 に答える 1

9

あなたは何をしようとしているのですか?これが機能する場合でも、このコードはAndroidでのSHA1PRNG実装の癖に依存しているため、いつでも機能しなくなる可能性があります。通常、setSeed()エントロピーを追加するため、同じシードをシードしても同じ数が得られるとは限りませんSecureRandom。デスクトップJavaでこのコードを試してみると、おそらく失敗します。これまでのところ、ほとんど(すべて?)の現在のAndroidバージョンで動作しますが、これは保証されていません。

予測可能なキーが必要な場合は、事前に生成されたキーを使用して各デバイスをプロビジョニングする必要があります。それらを安全に保存する必要がある場合は、KeyChainICSでAPIを使用するか、ICS以前のデバイスでパスフレーズで保護されたキーストアを使用してください。実際のキーを保存しなくても、誰かがキーの生成方法(シード)を知っていれば、同じキーを生成でき、キーはシードと同じくらい安全です。デバイス固有の場合、見つけるのはそれほど難しくない可能性があります。

これが機能しない理由については、RSAキージェネレーターは基本的BigIntegersにループ内でランダムに生成し、素数をテストします。素数テストは確率的であるため、実行ごとに異なる素数が選択される可能性があります。SpongyCastleを入手し、これをエミュレーターで実行し、ブレークポイントを設定しRSAKeyPairGenerator.javaて、正確に何が起こっているかを確認することをお勧めします。

于 2012-04-16T06:01:58.447 に答える