5

私の懸念は、ガベージコレクターによって管理される暗号化キーとシークレットが、ゼロ化されることなくメモリ内でコピーおよび移動される可能性があることです。

考えられる解決策として、次のことで十分ですか。

public class Key {
  private char[] key;
  // ...
  protected void finalize() throws Throwable { 
    try {
      for(int k = 0; k < key.length; k++) {
        key[k] = '\0';
      }
    } catch (Exception e) {
      //...
    } finally {
      super.finalize();
    }
  }
  // ...
}

編集:私の問題は、オブジェクトの公式(参照)コピーのゼロ化だけでなく、スペースと速度の効率のためにメモリをシャッフルしている間にガベージコレクターが作成した可能性のある古いコピーにも関係していることに注意してください。

最も単純な例は、マークアンドスイープGCです。この場合、オブジェクトは「参照済み」としてマークされ、それらのオブジェクトはすべて別の領域にコピーされます。残りはゴミなので回収されます。コピーが発生すると、ガベージコレクターによって管理されなくなった残りのキーデータが残る可能性があります(「公式」データが新しいリージョンにあるため)。

これに対するリトマス試験は、暗号モジュールでキーを使用し、キーをゼロ化してから、JVMプロセススペース全体を検査する場合、そのキーは見つからないはずです。

4

4 に答える 4

4

Java Cryptography Extensionリファレンスガイドでは、パスワードに文字列ではなく文字配列を常に使用して、後でゼロにできるようにすることをお勧めします。また、それを実装する方法のコード例も提供します。

于 2010-03-23T19:31:39.337 に答える
1

では、メモリ内のデータが特定の時間に上書きされない場合はどうなるでしょうか。攻撃者がマシンのメモリを読み取ることを心配する必要がある場合、それが問題であり、攻撃者がいつそこに何を見つけることができるかではありません。

キーがJVMのメモリのどこかに残っていることが深刻な問題になる可能性があることを心配している実際の攻撃シナリオは何ですか?攻撃者がJVMのメモリを見ることができれば、攻撃者はあなたがまだそれらを使用している間にそれらのキーを捕まえることもできます。

また、攻撃者がシステム上で通常のユーザーとして実行され、JVMによって破棄されたメモリを取得することを心配している場合:最近のすべてのOSは、新しく割り当てられたメモリをゼロで上書きします。

于 2010-03-25T15:59:26.883 に答える
1

最善の策はallocateDirect、NIOで使用することです。正気の実装では、それは動かされるべきではありません。ただし、おそらくディスクへのページアウト(ポーリングできます)と休止状態の対象になります。

于 2010-03-23T19:36:44.433 に答える
0

ですから、@ jambjoと@jamesから、キーがコピーされて説明されなくなるのを防ぐためにできることは何もないという結論に達しました。

開発者としての最善の戦略は、暗号ライブラリをC(または他の非管理言語)にドロップし、そこにあなたのものを実装することです。

彼らがより良い解決策を思い付くことができれば、私は他の誰かからの答えを喜んで受け入れます。

于 2010-03-25T15:42:10.647 に答える