问题描述
给定密码 P
和散列 H
,函数 bcrypt.compare(P,H)
会告诉您 H
是否是 P
的 bcrypt 散列。
问题:bcrypt.compare
如何做到以上几点?这对我来说很神秘,因为 P
可能与许多不同的散列相关联,而 bcrypt
本身似乎没有它为 P
创建的散列的任何“记忆”。
(额外问题:我是否正确地假设上述暗示每个 bcrypt 哈希都与一个密码相关联?或者我错了——一个哈希可能与许多密码相关联?)
解决方法
哈希:
string BCryptHashPassword(password)
{
Byte[] salt = GenerateSomeSalt();
return DoTheHash(password,salt);
}
验证:
Boolean BCryptVerifyPassword(password,expectedHash)
{
Byte[] salt = ExtractSaltFromExpectedHash(expectedHash);
String actualHash = DoTheHash(password,salt);
return (actualHash == expectedHash);
}
它用原始盐再次散列密码,并比较它们。 }