2017-02-24 1 views
1

最近、私は新しいWebアプリケーションを学びます。そのユーザ認証の部分では、PHPでcrypt()を使ってユーザを認証しています。しかし、コードは以下のようなものです:PHPの機能:crypt(string str、string [salt])はどのように動作しますか?塩が暗号化された結果と同じである可能性はありますか?

if ($auth != crypt(md5($cdata), $auth)) 
{ 
    exit(); //exit 
} 
//the code after authorization; 

それは、認可後のコードを実行できるように、この機能では、塩は、暗号化された結果に等しいことができることは可能ですか? 私はこれを全く理解できません。答えに熱心なので、ありがとう!

答えて

3

まず、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を返します。

+0

thxたくさん!私は慎重にurの答えを読むが、まだそれを取得しないでください。 Uは古いハッシュと新しいパスワードの部分を言った、私は完全に同意する。しかし、暗号化された結果がソルト値と等しいかどうかはまだ言及していません。より具体的には、$ auth == crypt(md5($ cdata)、$ auth)が満たすことができるように$ authを作成するにはどうすればよいですか?再度、感謝します。 – Chandler

+0

私が言ったように: 'crypt()'は使わず、 'md5()'は使わず、 '=='を使って比較しないでください。 'password_hash()'を使ってハッシュ値を作成し、 'password_verify()'を使って与えられたパスワードがハッシュ値と一致するかどうかを調べます。 – Sven

関連する問題