bcrypt 如何“知道”给定的哈希值是否与给定的密码相关联?

问题描述

给定密码 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);
}

它用原始盐再次散列密码,并比较它们。 }