私は手に困惑しています。機密情報を暗号化/復号化する AES サービスを作成しました。AES キーは、Java のSecureRandom
. シードを格納する保護されたファイルがあり、サービスを呼び出すと、シードが Secure Random クラスに取り込まれます。
それが機能することを確認するために、次のロジックがあります。
private boolean secureRandom(final String seed) {
SecureRandom sr1 = new SecureRandom(seed.getBytes(UTF8_CHARSET));
SecureRandom sr2 = new SecureRandom(seed.getBytes(UTF8_CHARSET));
//Two secure random with the same seed should generate the same results
boolean secureRandomWorks = sr1.nextLong() == sr2.nextLong();
if (!secureRandomWorks) {
System.err.println("Secure random not supported. Defaulting to old key");
}
return secureRandomWorks;
}
ここでの考え方は、同じシードを持つ 2 つの安全なランダム オブジェクトを作成できる必要があり、呼び出し時に両方とも同じ値を返す必要があるということです。nextLong()
アプリケーションを Windows マシンにデプロイすると問題なく動作しますが、RHEL 7 マシンにデプロイするとエラーが発生します。
シードが同じである限り、両方のインスタンスが常に同じ出力を生成するという印象を受けました。これは Windows の場合のようですが、RHEL 7 でテストしたときはそうではないようです。
検証を確認するために、この簡単なテストを作成しました。
SecureRandom sr1 = new SecureRandom("encryptionKey".getBytes("UTF-8"));
SecureRandom sr2 = new SecureRandom("encryptionKey".getBytes("UTF-8"));
for (int i = 0; i < 1000; i++) {
System.out.println(sr1.nextLong() == sr2.nextLong());
}
また、Windows ではすべての出力が true でしたが、RHEL 7 では false でした。
RHEL 7 がシードを無視する原因について何か提案はありますか?