我有这个密码
<?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!";
}
?>我被告知“密码已确认!”即使我不应该。我做错了什么?
发布于 2014-06-29 13:59:24
选择算法的机制是为$salt提供给定的语法。例如,要选择Blowfish,您必须遵循以下规则:
河豚用盐散列如下:"$2a$","$2x$“或"$2y$",一个两位数的成本参数,$ "$",以及字母表中的22个字符。..。两位数的成本参数是底层基于Blowfish的散列算法的迭代计数的基-2对数,必须在04-31范围内,超出此范围的值将导致crypt()失败。
您的salt (您称之为$code)是一个随机的50字节字母数字字符串,它似乎与手册中定义的任何规则不匹配,所以可能发生的情况如下:
更糟糕的是,一些旧的散列算法具有最大字符串大小。
回退算法可能是CRYPT_STD_DES。
标准的基于DES的散列,从字母表中带有两个字符的盐分"./0-9A-Za-z“。
在我的系统中,只考虑密码的前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"解决方案:不要让系统为您选择默认值。
https://stackoverflow.com/questions/24476407
复制相似问题