我创建了一个页面,它生成一个40个字符的盐,然后获取输入的密码并使用此PHP代码创建一个哈希,并将salt和哈希密码插入到数据库中只是相关行):PHP盐和哈希密码不匹配
$hashedpassword = sha1($password . $salt);
然后在登录过程中,我用的是输入的密码,并从数据库中检索盐打造具有使用的代码(再次同一直线上,这只是有关线):
$hashedpassword = sha1($storedPassword . $storedSalt);
但它不符合散列密码存储,所以要看看是否有错误,我“遥相呼应”的信息,所以我可以阅读发生了什么事:
$storedSalt = $row_rsSaltLookup['salt'];
$storedPassword = $row_rsSaltLookup['password'];
$storedHashedPassword = $row_rsSaltLookup['hashedpassword'];
//use the stored salt to hash the user's submitted password
$hashedpassword = sha1($storedPassword . $storedSalt);
echo "Salt: " . $storedSalt . "<br/>";
echo "Stored Password: " . $storedPassword . "<br/>";
echo "Stored Hashed Password: " . $storedHashedPassword . "<br/>";
echo "Pre-hash: " . $storedPassword . $storedSalt . "<br/>";
echo "Hashed Password: " . $hashedpassword . "<br/>";
echo "re-Hashed Password: " . sha1($storedPassword . $storedSalt) . "<br/>";
echo "re-Hashed Password 2: " . sha1($storedPassword . $storedSalt) . "<br/>";
if($storedHashedPassword != $hashedpassword) {
echo "NO MATCH";
}else{
echo "MATCH";
}
exit();
而且我得到这个结果:
Salt: 4039505cc4efae2
Stored Password: ujwiervdhyf
Stored Hashed Password: aa27c197dfd88cd2f0d46b84d259016a15bd3954
Pre-hash: ujwiervdhyf4039505cc4efae2
Hashed Password: b06193ed26617c449902ac813376cf0c33bec3d1
re-Hashed Password: b06193ed26617c449902ac813376cf0c33bec3d1
re-Hashed Password 2: b06193ed26617c449902ac813376cf0c33bec3d1
NO MATCH
在这个例子中,生成“盐”并将其与创建和散列帐户时的密码(存储密码)放在一起(存储散列密码)。 当我登录时,我从数据库中获取salt并将其添加到登录密码中,然后对其进行散列并将其与存储的散列密码进行比较,该密码应该是相同的? 所以我想知道我错在哪里,因为我似乎无法弄清楚为什么哈希不匹配。
也许[你应该使用bcrypt用于存储密码(http://phpmaster.com/why-you-should-use-bcrypt-to-hash-stored-passwords/) –
所以你'存储明文密码**和**相同密码的哈希值?你的思维过程很难遵循。 – Crontab
错误,你存储了哪个哈希?你也错过了将它放入调试输出。请注意MySQL在列大小太小的情况下会自动截断数据。 – hakre