0

私はコードを持っていますが、JIT がメソッドclearArraySafelyを最適化するのを防ぐことはできますか? コードの一部の JIT を選択的に無効にすることは可能ですか?

または、このコードが最適化されないことをどのように確認できますか?

private static char[] password;

public static void clearArraySafely() {
    // Overwritting array
    for (int i = 0 ; i <= password.length; i++) {
       password[i] = 0;
       //System.out.print(i); // <- I don't want to do this trick to be sure
    }
    password = null;
}

文字配列の代わりにパスワードを保存するための適切なクラスはありますか?

4

2 に答える 2

2

この質問には 2 つの答えがあります。

  1. 私の知る限り、すべてのメソッドをオフにすることなく、メソッドの最適化を「オフ」にする方法はありません。

  2. 現行世代の Java コンパイラーで懸念している特定の最適化を阻害する可能性が高いことを行うことができます。例えば:

        private static char[] password;
        public static String dummy;
    
        public static void clearArraySafely() {
            // Overwritting array
            for (int i = 0 ; i <= password.length; i++) {
               password[i] = 0;
            }
            dummy = new String(password);
            password = null;
        }
    

    JIT コンパイラーは、ゼロ割り当てを最適化して除去することはできません。その場合、「間違った」内容のダミー文字列が作成されます。また、dummyJLS ルールを破ることなくリフレクションによってアクセスできるため、JIT はエスケープ分析を適用して作成を回避することはできません。

    ただし、将来の世代の JIT コンパイラが ... より賢くなる可能性は常にあることに注意してください。それを避けたい場合はdummy、何らかの方法でプログラムの出力に影響を与えることを確認する必要があります。たとえば、それを印刷します。

文字配列の代わりにパスワードを保存するための適切なクラスはありますか?

私の知る限り、同じ問題に悩まされない人はいません。


そうは言っても、パスワードを保護するためにこのレベルに行くことは(IMO)パラノイアに近い. 誰かがヒープ内の到達不能オブジェクトからパスワードを盗むのに必要なレベルのアクセス権を持っている場合、他の方法でパスワードを取得できる可能性が高くなります。たとえば、OS レベルで文字をインターセプトするか、JVM を「デバッグ」します。


私のパラノイアは、デバッグ JVM に関連しています。

残念ながら、あなたのパラノイアは役に立ちません。

たとえば、誰かがデバッガーをアタッチするのを防ぐために設計したスキームは、リバース エンジニアリングを行ってからexeファイルを変更することで無効にすることができます。そして、あなたが考案した他のスキームも同様です。

ユーザーがプログラムが実行されるプラットフォームを制御している場合、実行中のプログラムの「デバッグ」を止めることはできません。これを防ぐ唯一の方法は、制御しているプラ​​ットフォームでのみアプリケーションを実行することです

(ところで、これは Java 固有の問題ではありません。すべてのプログラミング言語に当てはまります。他の言語よりも「ハッキング」しやすい言語もありますが、悪意のあるユーザーがスキルと意欲があり、開発する時間があれば、すべてハッキングできます。 "ハック"。)

于 2013-06-05T02:14:07.263 に答える