7

crypt()の PHP マニュアル ページの例を次に示します。

<?php
$password = crypt('mypassword'); // let the salt be automatically generated

/* You should pass the entire results of crypt() as the salt for comparing a
   password, to avoid problems when different hashing algorithms are used. (As
   it says above, standard DES-based password hashing uses a 2-character salt,
   but MD5-based hashing uses 12.) */
if (crypt($user_input, $password) == $password) {
   echo "Password verified!";
}
?>

なぜこれが機能するのですか?実際の管理者に使用してもらい'mypassword'たいパスワードだと思います。だから私はそれを最初に暗号化し、それを に等しく設定し$passwordます。明らかに、それをDBに保存する必要があります。しかし、次の行では、ソルトと私が比較しているものの両方として使用されています。この後者の場合、理想的には正しいパスワード as を持っているが、比較されてソルト化されている場合、どうすればと等しくcrypt($user_input, $password)なる可能性があるのか​​ わかりませんに。最後の行が$password$user_input$password$password

if (crypt($user_input) == $password) {
   echo "Password verified!";
}

私は何を理解していませんか?

4

1 に答える 1

8

crypt一方向関数であり、既にソルトを含む文字列を返します。出力は、 に格納されているものと似てい/etc/shadowます。

php.net の例:

<?php
echo 'result: ' . crypt('somepassword');
echo 'result: ' . crypt('somepassword');
echo 'result: ' . crypt('somepassword');
?>

result: $1$K2D8DGwq$b05uO37aMwO4rnDlB9Rsi1
result: $1$aPBvu2y.$213YVEs8/5m.jMCXSScly/
result: $1$dW3Xu2p6$nuCtJe2zzlgBMLxN2oZCx/

ユーザー入力を暗号化の結果と比較すると、関数は自動的に文字列からソルトを抽出します。

于 2010-02-10T09:46:42.463 に答える