PHP hash() returns 空字符串...有时

PHP hash() returns empty string... sometimes

我对 php hash() 函数有非常恼人的问题。对于某些字符串,返回的哈希只是一个空字符串,对于其他字符串,它工作正常。

我写了以下内容:

$new_salted_pw = $salt.$pepper.$new_pw; 
echo $new_salted_pw."... "; 
$hash = hash("sha256", $new_salted_pw);
if($hash>120)       
    $hash = substr($hash, 120);

echo $hash;

我用了密码geheim23Geheim23来测试,所以只有1个字符的区别。

结果是:

k0g3po32ggd0sv8oehgklbp2bd8eddxXMaxGTPJSQZSAJzgZSgaZxvUfGeheim23... d79e2044baa8a0a7363c88b4a2224277ac883eabc22cd28d61c1cdc31bb1c3fc

k0g3po32ggd0sv8oehgklbp2bd8eddxXMaxGTPJSQZSAJzgZSgaZxvUfgeheim23...

第二个没有散列。它是空的。相同的代码,没有结果。

更有趣的是,以完全相同的方式散列 geheim23 在我的脚本的不同部分没有问题。

那时我决定询问 Whosebug 是否知道为什么 PHP 对我这样做,如何修复它,或者我可以使用什么函数来代替 hash()。

谢谢。

问题不在于hash()函数!问题出在 substr() 函数中。你必须改变这个:

(此处您从位置 120 开始,但您希望字符串形式为 0 到 120)

$hash = substr($hash, 120);

至:

$hash = substr($hash,0,  120);

另外我认为你想检查长度是否超过 120 而不是哈希值是否大于 120 所以改变这个:

if($hash>120)   

对此:

if(strlen($hash) > 120)   

有关 substr() 的更多信息,请参阅手册:http://php.net/manual/en/function.substr.php

引自那里:

string substr ( string $string , int $start [, int $length ] )

您应该使用 password_hash() and password_verify() 作为 hashing/verifying 个密码。

这些功能在 PHP > 5.5 中可用,但我不知道为什么有人应该为旧版本做一个新项目。

为什么要使用它:

  • 易于使用
  • 你不在乎盐
  • 它是为散列密码而制作的(不像 md5、sha* 等)