0

申し訳ありませんが、これはばかげているかもしれませんが、Phpassについて私が理解していないことがあります。次のような安全なハッシュパスワードを作成できる場合:

$pwdHasher = new PasswordHash(8, FALSE);
$hash = $pwdHasher->HashPassword( $password );

後で次のように確認します。

$checked = $pwdHasher->CheckPassword($password, $hash); 

つまり、論理的には、パスワードは特定のマシンでのみ読み取ることができるように保存する必要があります(そうでない場合、誰かが別のマシンの「CheckPassword」機能を使用してパスワードを取得する可能性があります)。Phpassはこれをどのように行いますか?

将来、Webサイトを新しいサーバーに移動する必要がある場合、これは問題になりませんか?サーバーに重大な障害が発生した場合にすべてのパスワードを回復できるように、データベースを安全にバックアップするにはどうすればよいですか?(私は何か明らかなものが欠けていますか?)

編集-以下のコメントに応えて、異なるマシンがそれに影響を与えない場合、ハッカーが私のデータベースにアクセスした場合、なぜ彼らは自分のマシンでCheckPasswordを実行して元のパスワードを取得できないのですか?申し訳ありませんが、明らかな何かが欠けているに違いありません。

編集2-くそー、私は明らかな何かが欠けていました。比較関数は、指定されたパスワードをハッシュされたパスワードと照合するだけで、trueまたはfalseを返します。実際にパスワード自体にアクセスする必要はありません。ばかげたことをお詫びします!

4

2 に答える 2

2

bcryptによって作成されたハッシュは、ハッシュ値だけでなく、使用されたハッシュ関数、ラウンド数、およびハッシュ値の作成に使用されたソルトのインジケーターも含むモジュラー暗号化形式を使用します。あなたの場合、返される文字列は次のようになります。

$2a$08$sssssssssssssssssssssshhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh

つまり、パスワードを確認するために必要なものはすべてこの文字列に格納されます。

攻撃者がこの文字列を使用して元のパスワードを取得できない理由は、優れた暗号化ハッシュ関数の1つの重要な特性、つまり「特定のハッシュを持つメッセージを生成することは不可能である」ためです。</ p>

于 2011-06-24T08:39:36.837 に答える
0

CheckPassword() does not return the original password. CheckPassword just checks to see if the passed-in password hashes to the passed-in hash. If it does, it returns true, if it doesn't, it returns false. You may want to have a read of the phpass article "How to manage a PHP application's users and passwords". That gives a very detailed description of how password hashing works in general, and in phpass in particular.

于 2011-06-24T08:51:00.927 に答える