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;
我用了密码geheim23
和Geheim23
来测试,所以只有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* 等)
我对 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;
我用了密码geheim23
和Geheim23
来测试,所以只有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* 等)