パスワードを比較する場合、パスワードをメモリに保持するという問題が常に発生します。代わりに、パスワードが導入された瞬間に、それを md5 スナップショット (またはその他のハッシュ生成関数) に置き換えたいと思います。
キーと値のペアがあると仮定すると、String password = "Secret";
「秘密」を一意のものにスクランブルする最も簡単な方法は何ですか?
パスワードを比較する場合、パスワードをメモリに保持するという問題が常に発生します。代わりに、パスワードが導入された瞬間に、それを md5 スナップショット (またはその他のハッシュ生成関数) に置き換えたいと思います。
キーと値のペアがあると仮定すると、String password = "Secret";
「秘密」を一意のものにスクランブルする最も簡単な方法は何ですか?
でパスワードを取得するとすぐに、パスワードString
をゼロにすることができないため、すでに失敗しています。別のオブジェクトが偶然に上書きするまで、ヒープに残ります。最初に確認する必要があるのは、パスワードのみを保持char[]
し、できるだけ早く手動でゼロにすることです。ハッシュに関しては、JDK にはそれらのサポートが付属しています。チェックアウトしてくださいjava.security.MessageDigest
。
MessageDigest を使用します。このようなもの:
MessageDigest algorithm = MessageDigest.getInstance("MD5");
algorithm.reset();
algorithm.update(password.getBytes());
byte bytes[] = algorithm.digest();
StringBuffer sb = new StringBuffer();
for (byte b : bytes) {
String hex = Integer.toHexString(0xff & b);
if(hex.length() == 1)
sb.append('0');
sb.append(hex);
}
result = sb.toString();
また、MD5 アルゴリズムが何らかの形で利用できない場合に getInstance メソッドによってスローされる NoSuchAlgorithmException にも注意してください。
Messagedigestクラスを使用してハッシュを生成できます
しかし、重要なのは、パスワード全体をメモリに取得しないことだと思います-ある種のバイトストリームを介してパスワードを読み取っている場合は、メッセージダイジェストクラスの更新メソッドを使用して、メッセージダイジェストに直接読み取ってください。結果を取得するには、コールダイジェストの読み取りを終了します。