PHP hash()返回空字符串...有时候

时间:2015-01-17 11:02:40

标签: php hash sha256

我对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以完全相同的方式在我的脚本的不同部分中工作而没有问题。

当我决定询问Stackoverflow时,它是否知道PHP为什么要这样做,如何修复它,或者我可以使用什么函数而不是hash()。

谢谢。

2 个答案:

答案 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但我不知道为什么有人应该为旧版本做一个新项目。

有些原因你应该使用它:

  • 它易于使用
  • 你不关心盐
  • 用于散列密码(不像md5,sha *等)