我对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
以完全相同的方式在我的脚本的不同部分中工作而没有问题。
当我决定询问Stackoverflow时,它是否知道PHP为什么要这样做,如何修复它,或者我可以使用什么函数而不是hash()。
谢谢。
答案 0 :(得分:2)
问题不在于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])
答案 1 :(得分:0)
您应该使用password_hash()和password_verify()进行哈希/验证密码。
这些功能在PHP中可用> 5.5但我不知道为什么有人应该为旧版本做一个新项目。
有些原因你应该使用它: