用php crypt加密()

时间:2014-06-29 13:18:24

标签: php crypt

我有这段代码

<?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;即使我不应该。 我做错了什么?

1 个答案:

答案 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"

解决方案:不要让系统为您选择默认值。