这让我感到惊讶 - 这应该是相当简单的,但我无法弄清楚它们之间的区别。
我有这个函数来生成一个盐:
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()和比较结果没有让我到任何地方?
答案 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)];