使用php crypt()加密


Crypting with 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!";
}
?>

我被告知'密码验证!"即使我不应该。我做错了什么?

选择算法的机制是提供具有给定语法的$salt。例如,要选择Blowfish,您必须遵循以下规则:

河豚与盐的散列如下:"$2a$","$2x$"或"$2y$",a2位成本参数"$"和22个字母"。/0-9A-Za-z"。[…两位数的成本参数的迭代计数的以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"

解决方法:不要让系统为你选择默认值