まず、crypt()
とmd5()
を使用しないでください。password_hash()
とpassword_verify()
を使用してください。詳細はhttp://php.net/password_hashを参照してください。これらの関数は非常に使いやすく、設定を必要とせず、5.3.9までのほとんどすべてのPHPバージョン(ネイティブ関数がまだ含まれていない場合はPHPライブラリ)で使用できます。
第2に、作成されたハッシュ(暗号でも)には塩が含まれているため、パスワードの以前に作成されたハッシュ値についてはpassword_verify()
が知る必要があります。それは、salt部分とそれからハッシュパラメータを読み込み、指定された新しいパスワードをsaltとパラメータでハッシュし、現在与えられているパスワードからの結果が古いハッシュと同じであれば、パスワードは正しいです。
例示する:
echo password_hash('foo', PASSWORD_DEFAULT);
> $2y$10$ODIL7VQp1aLOfLrEv2rPQ.wFIbBr7hvQtMTuw4B4xnB/qI7nnMpVO
$2y$
は(bcryptのある)ハッシュアルゴリズムを知らせる、以下10$
はbcryptの(ハッシュの10ラウンド)ためのパラメータであり、文字列の残りの部分は、部分的に塩で部分的にはハッシュ値です。 password_hash()
を呼び出すと、塩の値がランダムに生成され、毎回異なる文字列が返されることに注意してください。パスワードの確認
var_dump(password_verify('foo', '$2y$10$ODIL7VQp1aLOfLrEv2rPQ.wFIbBr7hvQtMTuw4B4xnB/qI7nnMpVO'));
> bool(true)
はいつもこのように簡単です:password_verify()
に新しいパスワードと古いハッシュを渡す - それらが一致する場合、それはtrue
を返します。
thxたくさん!私は慎重にurの答えを読むが、まだそれを取得しないでください。 Uは古いハッシュと新しいパスワードの部分を言った、私は完全に同意する。しかし、暗号化された結果がソルト値と等しいかどうかはまだ言及していません。より具体的には、$ auth == crypt(md5($ cdata)、$ auth)が満たすことができるように$ authを作成するにはどうすればよいですか?再度、感謝します。 – Chandler
私が言ったように: 'crypt()'は使わず、 'md5()'は使わず、 '=='を使って比較しないでください。 'password_hash()'を使ってハッシュ値を作成し、 'password_verify()'を使って与えられたパスワードがハッシュ値と一致するかどうかを調べます。 – Sven