0

好的,所以我正在尝试使用 PHP 5.4 脚本和 MySQL 创建一些受密码保护的网页。运行样本产生了一些意想不到的结果!

我使用以下方法创建了密码:

$salt = "";
$salt.=substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",mt_rand(0,63), 1);
$salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", mt_rand(0, 63), 1);
$pw1 = crypt($pw,$salt);

并将 $pw1 存储在 MySQL 数据库中。

然后在我的身份验证页面中,我检索了数据库密码并使用表单中的用户输入来验证用户,检查如下:

get $db_pw from database then...
if (crypt($user_password,$db_pw) == $db_pw) ... proceed

一切正常,但如果我输入的字符串比密码长,它仍然可以通过。例如:如果我的密码是“stack”,如果我输入“stackoverflow”,它就会通过。如果我输入“stac”,它将按预期停止。

我试过搜索这个,但找不到类似的东西。我究竟做错了什么?

4

1 回答 1

0

看起来 crypt 函数有这个小警告:

基于标准 DES 的 crypt() 将 salt 作为输出的前两个字符返回。它也只使用 str 的前八个字符,因此以相同八个字符开头的较长字符串将生成相同的结果(当使用相同的盐时)。

所以我认为发生的事情不会发生在“stack”和“stackoverflow”上,而是发生在“stackove”和“stackoverflow”上。

使用crypt()是一个非常糟糕的主意。使用 PBKDF2 或 bcrypt 代替石器时代的 crypt。

于 2013-07-28T00:35:08.767 回答