web-dev-qa-db-ja.com

エントロピーを増やすためのパスワードのハッシュ

パスワードエントロピーを増やすためにアプリケーションで使用する前にパスワードをハッシュしても安全ですか?

アプリケーション自体でPBKDFが使用されている場合、これによりエントロピーが増加しますか、それともPBKDF自体がパスワードエントロピーを増加させますか?

ランダムなパスワードがmd5でハッシュされている場合、出力は128ビットのエントロピーを提供しますか?

編集:ハッシュ関数の結果を、AES-256、電子メール、コンピューターシステムへのアクセスなどの暗号化機能やアプリケーションのパスワードとして使用するためのものです。

使用される手順は、パスワード->パスワードのハッシュ->アプリケーションです。

編集2:たとえば、登録中に電子メールアプリケーションがパスワードを要求した場合、目的のパスワードは、提供される前にローカルでハッシュされます。

14
AXANO

いいえ、1回、2回、または10回ハッシュしてエントロピーを増やしません。エントロピーは、出力ではなく入力から見えるため、考慮してください。結果のエントロピーはカウントされないため、確定的プロセスを使用してエントロピーを追加することはできません。

次のようなコードがある場合でも、

$password = "123456";
$result = md5($password) . sha1($password) . hash('gost', $password);
echo $result;  //   e10adc3949ba59abbe56e057f20f
// 8941b84cdecc9c273927ff6d9cca1ae75945990a2cb1f
// 81e5daab52a987f6d788c372

そして、あなたは恐ろしい136バイトの文字列になり、パスワードは123456のままであり、ハッシュされたパスワードを総当たり攻撃する攻撃者は、123456が最上位であるため、平均して1回だけ試行する必要があります。ほとんどすべてのリストで最悪のパスワード。

ランダムなパスワードがmd5でハッシュされている場合、出力は128ビットのエントロピーを提供しますか?

いいえ、MD5は確定的であるため、攻撃者が文字列がMD5ハッシュであることを知っている場合、そのエントロピーは指定したランダムパスワードのエントロピーです。

パスワードをより安全にするには、適切なキーの導出を使用して( PBKDF2 が適切です)、ユーザーに長いパスワードを要求し、ユーザーが基本的なパスワードルールに従っているかどうかを確認します(文字が繰り返されていない)行、適切な長さ、数字と文字の混在、大文字と小文字の混在など)。

29
ThoriumBR

キー導出関数はエントロピーを増加させませんが、それは物事をより安全にします。 KDFには次の機能があります。

  • 正しい長さのキーを作成します。多くの暗号化アルゴリズムは、16バイトなどの固定サイズの長さを取ります。 KDFを使用すると、任意の長さのパスワードを使用できます。
  • パスワードのエントロピーをキー全体に分散します。暗号化アルゴリズムは、ランダムに見えるキーで機能することを意図しています。 1000000000000000をキーとして使用すると、暗号化アルゴリズムにセキュリティの問題が発生する可能性があります。 KDFはパスワードをランダムに見えるキーにスクランブルします。
  • 時間がかかる。ブルートフォース攻撃を遅くするために、キーの導出を遅くして、多くのパスワードを試すのに不合理な時間がかかるようにすることができます。
4
Sjoerd

TL; DR

パスワードを一部のサーバーに送信する前に不正なパスワードをハッシュすると、単純なパスワードマネージャーよりも時間がかかり、不快で安全ではなくなります。

質問は、ハッシュアルゴリズムを非常に単純なパスワードマネージャーとして誤用することを目的としているようです。

実際のパスワードマネージャを使用してください。

私はあなたの例を使って、なぜそれが悪い考えになるのかを示します:

  • 「エントロピーが豊富」ではないパスワードを持っている1111111111111
  • ハッシュは9DCBF642C78137F656BA7C24381AC25Bになります

これで、攻撃者は何らかの方法でパスワードがクリアテキストのデータベースを取得します(以前は頻繁に発生していました)。そして、なぜ彼がプレーンテキストを知っているハッシュを誤ってそこに検索するのでしょうか(それほど「エントロピーが豊富な」パスワードはその1つです)。これで彼は、ユーザー名/メールアドレスを持つユーザーが「1111111111111」を使用し、次にパスワードとしてMD5を使用することを知っています。次に、あなたが持っている利点は何ですか?誰かがもう一歩踏み出す必要がありますが、セキュリティに関しては、実際の違いはありません。

ここで、現実の世界で何が起こったかの違い:

あなたのやり方で:

ClearText-MD5-> HashedClearText-サーバーに送信(HTTP(S))-> | |-MD5/SHA */...-> HashedHashedClearText

通常の方法:

ClearText-サーバーに送信(HTTP(S))-> | | -MD5/SHA */...-> HashedClearText

3
Serverfrog