【问题标题】:crypt() function not giving proper hashescrypt() 函数没有给出正确的哈希值
【发布时间】:2012-10-15 23:58:43
【问题描述】:

我使用 thisthis 制作了一个密码散列脚本,除了某些时候 crypt 函数将散列作为“*0”,然后失败。

PHP 代码

    $password='password';
    $salt = '$2y$07$';
    $salt .= base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_RANDOM));
    $salt .='$$';
    $password_hash = crypt($password, $salt)';

    echo $password_hash.'<br />';

使用上面我得到的值是

    $salt = '$2y$07$8K3i8rJ7n7bsJA36CfbabQ==$$';
    $crypt_password = $password_hash;
    $crypt_password = '$2y$07$8K3i8rJ7n7bsJA36CfbabO9ojj2hl61azl8CubJQhRTgla4ICiCVC';
    if (crypt($password,$crypt_password)===$crypt_password)
    {
    echo 'password verified';
    }
    else{
    echo 'password NOT verified';
    }

请查看并提出任何可能的方法以使其正常工作。

谢谢。

【问题讨论】:

  • $crypt_password = $password_hash 抱歉我没有在上面提到
  • 验证步骤正确(cryptcrypt 返回的“哈希”中提取盐)。问题是,base64_encode 发出无效字符,例如+crypt 接受的字符:"./0-9A-Za-z")。如果base64_encode 返回无效字符,则返回"*0"
  • 这里有多个bcrypt 实现,为什么还要自己编写?

标签: php password-hash


【解决方案1】:

问题是base64_encode 可能会生成一个带有“+”符号的字符串,crypt 函数将其视为不正确的盐。

var_dump你的$salt$password,你会看到每次+字符在salt中使用,crypt函数将返回一个'*0'字符串——失败的标志。

解决此问题的一种可能方法是将所有“+”符号替换为“。”:

$salt = str_replace('+', '.', $salt);

【讨论】:

    猜你喜欢
    • 2015-07-05
    • 2014-07-01
    • 1970-01-01
    • 2020-06-12
    • 2015-11-10
    • 2018-01-21
    • 2020-07-18
    • 2012-11-06
    • 2013-07-30
    相关资源
    最近更新 更多