PHP SHA1给出的结果与预期的不同


PHP SHA1 gives different result than expected

这真的让我很惊讶-这应该是相当简单的,但我不知道有什么不同。

我有这个函数来生成一个盐:

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)];