以下是PHP manual page for crypt():
中的示例<?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中。但在下一行中它被用作盐和我正在比较的东西,我不明白crypt($user_input, $password)
如何可能等于$password
,如果在后一种情况下我有理想情况下,正确的密码为$user_input
,但与$password
进行比较并与$password
进行比较。如果最后一行是
if (crypt($user_input) == $password) {
echo "Password verified!";
}
我不理解什么?
答案 0 :(得分:8)
crypt
是一个单向函数,返回一个已包含salt的字符串。输出类似于/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/
将用户输入与crypt结果进行比较时,该函数会自动从字符串中提取salt。