这真的让我很惊讶-这应该是相当简单的,但我不知道有什么不同。
我有这个函数来生成一个盐:
private function _generateSalt($max = 128)
{
$characterList = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#¤%&/()~";
$i = 0;
$salt = "";
do {
$salt .= $characterList{mt_rand(0,strlen($characterList)-1)};
$i++;
} while ($i < $max);
return $salt;
}
基本(?)
并试图创建一个SHA1哈希从这个,给了我一个不同的结果,我希望:
$salt = $this->_generateSalt();
$password = $salt.$password;
echo sha1($password);
$password是由用户输入生成的字符串。回显的散列字符串是错误的。我不知道为什么。
var_dump($password);
在添加盐后给我预期的字符串大小-复制并粘贴结果到在线SHA1服务或通过MySQL CLI对字符串进行哈希,给出正确的结果。这就像在$password变量中有不可见的东西,我不想散列。但是我怎样才能知道为什么会这样呢?Var_dump (), trim()和比较结果没有得到我任何地方?
去掉所有非字母-数字的特殊字符-这个甚至不是ASCII,据我所知。因此,如果你在不同编码的字符串下运行sha1,可能会把事情搞砸。
(这个答案是从评论中复制粘贴的,并由于提问者的要求而添加为答案,因为它似乎解决了问题)
生成盐的更好方法是:
// True for cryptographically strong, FALSE otherwise
$salt_strong = TRUE;
// The length
$salt_length = 32;
// Create the salt and load the results into a local var
$salt = bin2hex( openssl_random_pseudo_bytes( $salt_length , $salt_strong ) );
这行不应该:$salt .= $characterList{mt_rand(0,strlen($characterList)-1)};
$salt .= $characterList[mt_rand(0,strlen($characterList)-1)];