我有这段代码
<?php
error_reporting(E_ALL);
$caratteri_disponibili ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
$lunghezza= 50;
$code = "";
for($i = 0; $i<$lunghezza; $i++){
$code = $code.substr($caratteri_disponibili,rand(0,strlen($caratteri_disponibili)-1),1);
}
$hashed_password = crypt('mypassword',$code);
?>
使用随机盐加密密码。 Error_reporting没有通知我任何错误,但当我尝试检查散列密码是否与使用此代码的其他输入匹配时(放在前一个相同的页面中)
<?php
$input = "Hey";
if (crypt($input, $hashed_password) == $hashed_password) {
echo "Password verified!";
}
?>
我告诉密码已验证!&#39;即使我不应该。 我做错了什么?
答案 0 :(得分:2)
选择算法的机制是提供具有给定语法的$salt
。例如,要选择Blowfish,您必须遵循以下规则:
河豚用盐调和如下:&#34; $ 2a $&#34;,&#34; $ 2x $&#34;或&#34; $ 2y $&#34;,a 两位数的成本参数,&#34; $&#34;,以及字母表中的22个字符 &#34; ./ 0-9A-ZA-Z&#34 ;. [...]两位数的成本 参数是迭代计数的base-2对数 底层基于Blowfish的散列算法,必须在范围内 04-31,超出此范围的值将导致crypt()失败。
您的盐(您称之为$code
)是一个随机的50字节字母数字字符串,似乎与手册中定义的任何规则都不匹配,因此可能会发生以下情况:
更糟糕的是,一些旧的哈希算法具有最大字符串大小。
回退算法可能是CRYPT_STD_DES
:
标准的基于DES的哈希,字母表中包含两个字符的盐 &#34; ./ 0-9A-ZA-Z&#34;
在我的系统中,只考虑8个第一个字节的密码:
var_dump( crypt('00000000 does not matter', 'aa does not matter') );
var_dump( crypt('00000000 how long passwords are', 'aa what I write here') );
var_dump( crypt('00000000 only 8 bytes count', 'aa because only first two bytes are used') );
string(13) "aaJfK9SF.cm2o"
string(13) "aaJfK9SF.cm2o"
string(13) "aaJfK9SF.cm2o"
解决方案:不要让系统为您选择默认值。