php - 为什么 crypt() 会产生不同的结果?

标签 php encryption passwords blowfish crypt

Crypt 使用相同的输入数据生成不同的哈希值,[以下] 以前的功能哈希生成器/检查不再用于验证用户:

public static function blowfish($password, $storedpass = false) {
    //if encrypted data is passed, check it against input ($info) 
      if ($storedpass) { 
            if (substr($storedpass, 0, 60) == crypt($password, "$2y$08$".substr($storedpass, 60))) { 
                return true; 
            }  else { 
                return false; 
            } 
      }  else { 
          //make a salt and hash it with input, and add salt to end 
          $salt = ""; 
          for ($i = 0; $i < 22; $i++) { 
            $salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", mt_rand(0, 63), 1); 
          } 
          //return 82 char string (60 char hash & 22 char salt) 
          return crypt($password, "$2y$08$".$salt).$salt; 
     }
}

我正在用头撞墙,但没有找到关于 Zend 的内部算法、PHP 和操作系统算法之间差异的答案;或 PHP 5.3.8 与更早版本之间的变化...

编辑:我的问题在技术上得到了回答,这是我没有正确提问的错。我已经实现:

$salt = substr(bin2hex(openssl_random_pseudo_bytes(22)), 0, 22);
          //for ($i = 0; $i < 22; $i++) { 
            //$salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", mt_rand(0, 63), 1); 
          //} 

我真正的问题是;为什么以下函数返回不同?

print(substr($storedpass, 0, 60)."<br />");

返回:$2y$08$43f053b1538df81054d4cOJyrO5/j7NtZBCw6LrFof29cLBs7giK6

print(crypt($password, "$2a$08$".substr($storedpass, 60)));

返回:$2a$08$43f053b1538df81054d4cOPSGh/LMc0PZx6RC6PlXOSc61BKq/F6。

最佳答案

因为您是在随机数的帮助下创建salt

函数mt_rand()每次调用时都会创建随机数,可选择使用 min、max 参数。通常对于强加密密码散列,应使用加密安全伪随机数生成器 (CSPRNG) 生成 Salt。

然后来到你的问题,我假设 ZEND 和 php 之间的算法没有区别。因为 zend 是一个围绕核心 php 的框架,并利用它。

要验证密码,crypt检查是如何工作的

crypt($password, $stored_hash) == $stored_hash;

一旦你在第一次散列时存储了散列,就可以很容易地通过它来验证。

这就是这里实际发生的情况,如果您将哈希作为第二个参数传递给函数 blowfish,它将通过 bool 值返回验证,而不管 salt。

if (substr($storedpass, 0, 60) == crypt($password, "$2y$08$".substr($storedpass, 60))) { 
    return true; 
}  else { 
    return false; 
}

有关哈希和安全性的信息,请阅读 this

希望对你有帮助

关于php - 为什么 crypt() 会产生不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11974091/

相关文章:

php - 在 Laravel Collective 的 Form::text() 中有条件地添加类

php - 显示每个类别最新帖子的下拉导航菜单

php - 命名空间接口(interface)

java - Weblogic 凭证解密问题

php - 我对哪些数据库有权限

java - 数字证书私钥添加密码:Failed to decode the file :Not in PKCS #12 format,

postgresql - pgp_sym_encrypt/pgp_sym_decrypt 错误处理

regex - 非典型密码验证正则表达式 : at least 3 letters, 3 个数字,无双引号

asp.net - 将 asp.net 应用程序转换为使用 asp.net 表单例份验证 - SQL Server 中的密码散列

c# - 为什么 PasswordBox 在 Silverlight 中被密封?