2017-12-07 4 views
1

javaでJavaでは、メモリダンプから値を保護するために、すべてのメソッド内でbyte []配列をクリアする方法はありますか?

私は以下のコードを実行すると、バイト配列の値がダイジェストメソッドにコピーされ、値を他のメソッドにコピーするため、pwdの値がすべてメモリ上に存在します。

import java.security.MessageDigest 

    byte[] pwd = "some_pwd".getBytes(); 
    MessageDigest md = MessageDigest.getInstance("SHA"); 
    for (int i = 0; i < 100; i++) { 
     byte[] hash = md.digest(pwd); 
    } 

メモリダンプソフトウェアには、私の顧客が気に入らないパスワードの値が表示されます。

バイト[]がメソッドごとに値によってコピーされていることを確認しました。

重要なバイト配列の値を保護する方法はありますか?

+2

いいえ。あなたのコードは、プログラムのRAMで発生する必要があるため、パスワード値を処理します(ハッシュするだけでも)。あなたの唯一の選択肢は、パスワードを可能な限り短い生活として保持する(範囲を制限する)ことです。 –

+0

あなたが参照として配列を渡すことができたとしても、この配列を使用している間にメモリをダンプすれば、その値を見ることができます(頻繁ではありませんが、少なくとも1回)。 – JohnnyAW

答えて

1

テキストは、好ましくは、文字列として渡すべきでないパスワードが、のは、これは一例であると仮定してみましょう:

その後のバイトは、テスト用の文字列には生じないことを確認。

byte[] pwd = "rnld^ovc".getBytes(StandardCharsets.UTF_8); // "some_pwd" 
for (int i = 0; i < pwd.length; ++i) { 
    pwd[i]++; 
} 

そして解決策:

MessageDigest md = MessageDigest.getInstance("SHA"); 
for (int i = 0; i < 100; i++) { 
    //byte[] hash = md.digest(pwd); 
    for (byte b : pwd) { 
     md.update(b - 1); // Maybe -1 if the string was the real password 
    } 
    byte[] hash = md.digest(); 
} 
Arrays.fill(pwd, (byte)0); 

今のMessageDigestを消化するための呼び出しで、配列のコピーを維持することはできません。

pwd配列を使用したくない場合は、パスワードフィールドから一度にchar/byteを取る必要があります。

+0

あなたは 'b -1'を忘れてしまったと思いますが、そうでなければ別の値のハッシュを計算します – JohnnyAW

+0

hmmm、私はまだ100%満足していません:)しかし、私はあなたができる最高だと思っています... – JohnnyAW

+0

@ JohnnyAW私は文字列が安価な-1の暗号化を含んでいることを意味したので、メモリダンプはそれを表示せず、pwdは本当のパスワードを含んでいます。そうでなければ1が本当に必要です。 –

関連する問題