1

私はウェブ開発の初心者です。Java を使用して、登録機能を備えた簡単なパイロット アプリケーションを開発してみます。セキュリティのために明示的にデータベースにユーザー パスワードを保存したくありません。

パスワードハッシュを保存する必要があると言われました。しかし、これはどういう意味ですか? ハッシュとは?Java では、すべてのオブジェクトに一意のハッシュ コードがあることを知っています。これは私が必要なものですか?パスワードのhashcode()メソッドを呼び出す必要がありますか? たぶん、暗号化方法を適用する必要があるだけですか?または、最初にパスワードのハッシュ コードを取得してから暗号化しますか?

パスワードを安全に保存するためのオプションとアプローチはたくさんあると思います。しかし、この場合のハッシュとは正確には何を意味するのでしょうか?

4

5 に答える 5

2

これは、ユーザーが登録時に入力したユーザー パスワードをプレーン テキストで保存せず、代わりに MD5 などの不可逆ハッシュ アルゴリズムでパスワードをハッシュし、この値をデータベースに保存することを意味します。

MD5 ハッシュを生成するにはどうすればよいですか?

パスワードをチェックするとき、ユーザーがログイン フォームに入力したパスワードを同じアルゴリズムを使用してハッシュし、データベースに保存されているパスワードと比較します。

于 2012-10-20T11:54:34.863 に答える
1

ユーザーのパスワードをどの程度安全にする必要があるかによっては、暗号ソルトとストレッチングも使用する必要がある場合があります。

ソルトとは、ハッシュする前にパスワードにランダムなバイトを追加することを意味します。そうすれば、2 人のユーザーが同じパスワードを選択すると、異なるハッシュを持つことになります。ソルトをハッシュと一緒に保存し、ハッシュを再計算する必要があるたびに使用します。

hash <- SHA256(password + salt)  // + is concatenation

ソルトとは、ユーザーの 1 人がパスワードを破った場合、同じパスワードを持つ他のユーザーがデータベース内で異なるハッシュを持つことを意味し、攻撃者がパスワードをすぐに知ることを防ぎます。ソルトの長さは、セキュリティを確保するために 16 バイトにすることができます。

ストレッチングとは、計算を何度も繰り返すことを意味するため、実行に約 0.1 秒かかります。10 分の 1 秒の遅延はユーザーに影響しませんが、パスワードを推測しようとする人は 1 秒間に 10 回しか推測できないことを意味します。

hash <- SHA256(password + salt)
do 5000 times
  hash <- SHA256(hash + salt)
end do

必要な遅延が得られるように数値を調整し5000ます。

于 2012-10-20T12:45:25.510 に答える
0

すべてのオプションの代わりに、PBKDF2 に関する情報を調べることをお勧めします。PBKDF2 は Java で実装されています。

byte[] salt = new byte[256 / Byte.SIZE];
SecureRandom defaultRNG = new SecureRandom();
defaultRNG.nextBytes(salt);

SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec ks = new PBEKeySpec(password,salt,2000,256);
SecretKey s = f.generateSecret(ks);
final byte[] result = s.getEncoded();

saltと の両方を保存する必要がありresultます。同じ計算を実行し、結果をバイナリ比較してパスワードを確認します。256 ビットのソルトと出力サイズを使用しました。SHA-1 の使用は、PBKDF2 内では問題になりません。反復回数は 2000 が最小値である必要があります。アプリケーションが CPU 要件を処理できる場合は、より高い値を使用してください。

于 2012-10-22T22:31:25.930 に答える
-1

プレーンまたは暗号化されたパスワードの代わりにハッシュを保存する主なアイデアは、ハッシュは元に戻すことができないということです。誰もがデータベースや暗号化キーにアクセスできますが、パスワードを知ることはできません。難読化/暗号化だけではありません。ハッシュは、パスワードの回復を可能にする情報を失い、パスワードを認識できないようにするために使用されます。ハッシュは、必要な程度の一意性と不可逆性を保証する、使用したい任意の関数です。Java ハッシュ コードは複製しやすく、MD5 と SHA1 には既知の弱点があります。現在推奨されているのは、たとえば SHA-256 です。

于 2012-10-20T12:47:34.980 に答える