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

时间:2011-08-24 22:22:38

标签: php sha1

这让我感到惊讶 - 这应该是相当简单的,但我无法弄清楚它们之间的区别。

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

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()和比较结果没有让我到任何地方?

3 个答案:

答案 0 :(得分:0)

生成盐的更好方法是:

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

答案 1 :(得分:0)

摆脱所有非字母数字特殊字符 - 据我所知,这个字符甚至不是ASCII:¤。因此,如果在以不同编码编码的字符串下运行sha1,它可能会搞乱。

(这个答案是从评论中复制粘贴并作为答案添加的,因为提问者的请求似乎可以解决问题)

答案 2 :(得分:-1)

不应该这一行: $salt .= $characterList{mt_rand(0,strlen($characterList)-1)};

看起来像这样:$salt .= $characterList[mt_rand(0,strlen($characterList)-1)];