【问题标题】:PHP hash() returns empty string... sometimesPHP hash() 返回空字符串...有时
【发布时间】:2024-01-22 20:14:01
【问题描述】:

我在使用 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 在我的脚本的不同部分中工作,没有问题。

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

谢谢。

【问题讨论】:

    标签: php hash sha256


    【解决方案1】:

    问题不在于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 ])

    【讨论】:

    • 天哪,它成功了。我很开心。我已经为此奋斗了一天。非常感谢,认真的。并感谢您的提示。将在 7 分钟内接受。
    【解决方案2】:

    您应该使用password_hash()password_verify() 来散列/验证密码。

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

    为什么你应该使用它:

    • 易于使用
    • 你不在乎盐
    • 用于哈希密码(不像 md5、sha* 等)

    【讨论】: