(PHP) 如何正确实现 crypt() 函数

7
以下是 crypt() 函数的 PHP 手册页面中的示例:

以下是来自PHP手册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。显然,我必须将其存储在数据库中。但是在下一行中,它被用作盐和我要比较的内容,我不明白如何crypt($user_input, $password)可以与$password相等,如果在后一种情况下,我理想情况下具有正确的密码作为$user_input,但是用$password进行了加盐并与$password进行比较。 如果最后一行是

,那对我来说更有意义。
if (crypt($user_input) == $password) {
   echo "Password verified!";
}

我没有理解什么?

你应该使用更高级的技术,例如md5、sha1等。 - dusoft
1
哈哈。哈哈。哈哈。哈哈哈。如果你是我的朋友,和我一起踏上这个史诗般的旅程,那该多好啊。https://dev59.com/F3E95IYBdhLWcg3wm_Mu - Tony Stark
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/

与加密结果比较用户输入时,该函数会自动从字符串中提取盐值。

4
这段话的意思是:它完美地回答了你的问题。crypt()函数输出一个字符串,其中包含盐和哈希结果。当你将这个字符串作为盐传递给它时,它会提取出盐部分并忽略哈希部分。它仍然返回一个包含盐和哈希的字符串。因此,这些字符串可以直接进行比较。 - gnud
哦,所以通过将 $password 作为盐值传递给它,它只提取了盐值部分,这就是用于原始 crypt() 调用的盐值,因此我不需要在我的数据库中存储盐值,只需存储散列后的密码即可? - Tony Stark
对不起,当我读到它时,它对我来说没有意义,但是gnud重新表述了它,以至于我认为我明白了。 - Tony Stark
@AndiDog 我知道这是一个旧帖子,但我认为在这里提问比自己发帖更有意义,但是这样做不安全,因为其他人拥有使用的盐吗?我对哈希很陌生,所以我只是试图理解为什么要这样做的逻辑。我正在尝试弄清楚是否要使用crypt()。再次感谢。 - Andy
@Andy:没有其他人能够获取盐。从crypt得到的结果存储在密码数据库中(例如/etc/shadow),该数据库不可公开访问。当然,黑客可能会窃取它,但是盐将防止他实际破解密码,绝对无法同时破解多个密码。关键是盐可以以明文形式存储,其目的是防止简单的密码攻击,如暴力破解。 - AndiDog
@AndiDog,所以将crypt()的结果存储在数据库中就足够了吗?这样把它们放在一起非常方便。非常感谢。 - Andy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接