2

私は手に困惑しています。機密情報を暗号化/復号化する 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 がシードを無視する原因について何か提案はありますか?

4

2 に答える 2

0

RHEL 7 (および一般的な Linux マシン) は、Windows とは異なるアルゴリズムをデフォルトで使用していることが判明しました。Linux が使用NativePRNGし、Windows は を使用しますSHA1PRNG

Linux は組み込みの を利用するか、/dev/randomまたは/dev/urandomを使用してNativePRNG.

これを念頭に置いて、 SecureRandom オブジェクトの初期化方法を変更できました

private static final String ALGORITHM = "SHA1PRNG";
private static final String PROVIDER = "SUN";

private SecureRandom getSecureRandom(String seed) throws NoSuchAlgorithmException, NoSuchProviderException {
  SecureRandom sr = SecureRandom.getInstance(ALGORITHM, PROVIDER);
  sr.setSeed(seed.getBytes(UTF8_CHARSET));
  return sr;
}

ドキュメントからgetInstanceオブジェクトをシードしないため、必要に応じて実行します。

返された SecureRandom オブジェクトはシードされていません。返されたオブジェクトをシードするには、setSeed メソッドを呼び出します。setSeed が呼び出されない場合、nextBytes への最初の呼び出しにより、SecureRandom オブジェクト自体が強制的にシードされます。setSeed が以前に呼び出された場合、このセルフシードは発生しません。

今は必要なものを使用することを余儀なくされており、RHEL 7 で問題が発生することはありません。

于 2018-05-01T13:01:36.927 に答える