我使用以下方法创建了密码:
$salt = "";
$salt.=substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",mt_rand(0,63), 1);
$salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", mt_rand(0, 63), 1);
$pw1 = crypt($pw,$salt);
并将$ pw1存储在MySQL数据库中。
然后在我的身份验证页面中,我检索了db密码并使用表单中的用户输入来验证用户,检查如下:
get $db_pw from database then...
if (crypt($user_password,$db_pw) == $db_pw) ... proceed
一切正常,但是如果我输入的字符串长于密码,它仍然可以通过。例如:如果我的密码是“堆栈”,如果我输入“stackoverflow”,它将通过确定。如果我进入“stac”,它将按预期停止。
我试过这个但是找不到类似的东西。 我做错了什么?
答案 0 :(得分:0)
看起来密码函数有这个小小的警告:
标准的基于DES的crypt()返回salt作为输出的前两个字符。它也只使用str的前八个字符,所以较长的字符串以相同的八个字符开头将产生相同的结果(当使用相同的盐时)。
所以我认为发生的事情不会发生在“堆栈”和“stackoverflow”上,而是与例如“stackove”和“stackoverflow”。
使用crypt()
是一个非常糟糕的主意。使用PBKDF2或bcrypt而不是石器时代的地穴。