1

システムのパスワード暗号化に Bcrypt を使用したいと考えています。しかし、すべての例は次のようなものです。

$password = $_POST['password'];
$salt = substr(str_replace('+', '.', base64_encode(sha1(microtime(true), true))), 0, 22);
$hash = crypt($password, '$2a$12$'.$salt);

これは私にはかなり安全に見えますが、各例で、Bcrypt を使用する前に誰もパスワードをハッシュしていないのではないかと思っていました。

固有のソルトにより、Rainbow テーブルは一度にすべてのパスワードをクラックできないはずです。しかし、ハッカーが 1 つのレコードを取得し、その特定のレコードのソルトを使用してレインボー テーブルを作成した場合、脆弱なパスワードを解読できるはずです。

したがって、誰かが脆弱なパスワード (「foo」としましょう) を使用した場合、Bcrypt を使用する前に、まず SHA-512 でハッシュする方が安全です。私は正しいですか?それとも、これはより安全に見えるだけですか?

4

4 に答える 4

2

実際には、答えはnoである必要があります。暗号学的な意味でハッシュが大幅に強化されるわけではありません。おそらくご存知のように、bcrypt (使用する関数の名前は ですがcrypt) はハッシュ関数そのものであり、暗号化関数ではありません。

bcrypt では、実行される反復回数 (通常は数百回) を定義するコスト係数を渡します。これにより、ハッシュの計算が遅くなり、ブルート フォース攻撃が実行不可能になります。以前に SHA-512 を使用すると、反復が 1 回だけ追加されます。

についてあなたが言ったことは正しいですが、もちろん、パスワードごとにレインボーテーブルを作成する必要がある場合は、一致するものが見つかるまで力ずくで実行するだけで、レインボーテーブル全体を作成する必要はありません.

攻撃者がデータベースとコードを制御している場合、追加の SHA-512 はまったく役に立ちません (さらに 1 回の反復のみ)。彼がコードなしのデータベース (SQL インジェクション) しか持っていない場合、彼はbcrypt ハッシュを認識します。彼は現在、bcrypt でブルート フォース攻撃を実行できますが、SHA-512 のおかげで脆弱なパスワードはありません。SHA-512 ハッシュがクラックするパスワードになるようなものなので、辞書は役に立ちません。これは隠蔽によるセキュリティですが、コードが不明である限り有効です。一意のソルトで bcrypt を使用する前に、ハードコードされた修正ソルト (キー) を追加することで、同じ効果をより簡単に得ることができます。

于 2012-06-30T20:00:23.853 に答える
1

最初にハッシュしても役に立ちません。悪いパスワードとは、攻撃者がより可能性が高いと見なし、試行するパスワードのリストの前に配置するパスワードです。

Bcrypt はソルトを組み込んで、事前に計算されたルックアップ テーブルを排除します (レインボー テーブルはその一例です)。攻撃者が 1 つのレコードに対してレインボー テーブルを作成するのはなぜですか? いいえ、ソルト化されたパスワードを攻撃する場合、攻撃者は最も可能性の高いパスワードの順序付けられたリストを単純に処理し、ハッシュ アルゴリズムを繰り返して一致するかどうかを確認します。

そのリストをどこまで処理できるかは、ハッシュ アルゴリズムの実行にかかる時間によって異なります。Bcryptはそれを「コスト」係数で制御します—例では12です(これは問題ありませんが、おそらく私が使用する最小値です)。追加の SHA-512 ラウンドはそれに何も追加しません。すでに 4096 回の高価な bcrypt 反復を実行しています。安価な SHA-512 反復を 1 回追加することは無視できます。

リストの最初のパスワードを選択すると、一瞬で破られます。10 億番目のパスワードを選んだ場合、攻撃者は数十年間それを破ることはありません。

于 2012-06-30T19:28:32.557 に答える
1

crypt()暗号化メカニズムではなく、一方向の文字列ハッシュです。SHA-512 ハッシュを使用するには、hash()関数を使用する必要があります。Bcrypt には PHP 拡張機能が必要です。パスワードを保存するために、パスワードを単にハッシュするのではなく、元に戻せるようにしたいのはなぜですか? これは安全性が低くなります。誰かがあなたのキーと DB を入手した場合、その人はすべてのパスワードを知っていますが、SHA512 ハッシュのテーブルはほとんど役に立ちません。

于 2012-06-30T18:50:31.590 に答える
0

bcrypt はすでにソルトを使用しており、内部で行っていることは SHA512 よりもかなり強力です。bcrypt の上に SHA512 の反復 (および/またはソルトの追加レイヤー) を追加しても、大幅に強力な結果は得られません。2 つの関数が間違った方法で相互作用する場合、この方法でそれらを組み合わせると、実際にはより弱いハッシュ関数が得られる可能性があります。

于 2012-06-30T19:18:42.157 に答える