每次我使用:
BCrypt.HashPassword(password, 12)
它给了我不同的输出。根据我的阅读,为了检查登录详细信息,我必须拥有密码本身:
BCrypt.Verify(expectedPassword , hashed);
所以我很困惑:我认为我应该只在我的数据库中保留哈希,而不是密码本身。我错过了什么?
每次我使用:
BCrypt.HashPassword(password, 12)
它给了我不同的输出。根据我的阅读,为了检查登录详细信息,我必须拥有密码本身:
BCrypt.Verify(expectedPassword , hashed);
所以我很困惑:我认为我应该只在我的数据库中保留哈希,而不是密码本身。我错过了什么?
当您声明时,您是 100% 正确的:
我想我应该只在我的数据库中保留哈希,而不是密码本身。
继我们的在线聊天之后,我们澄清了您所查询的问题,一般流程如下:
稍后的 ...
需要注意的重要一点是,对于给定的哈希算法,两个相同的字符串将始终哈希为相同的值,因此这种比较是安全的。
当仍在内存中时,允许密码为纯文本是标准的。理论上可以在它到达服务器之前对其进行加密(例如,如果存在用 JavaScript 编写的 SHA-512 程序在密码提交之前对其进行哈希处理,我不会感到惊讶),但这通常甚至超出了最复杂的安全要求。
在代码中
BCrypt.Verify(expectedPassword , hashed);
您使用名称“expectedPassword”,我想知道这是否表明您的误解。这不是您希望用户输入的密码。那是他们试图用来登录的纯文本密码。
第二个参数,hashed,是他们的“官方”密码(即他们注册的密码)的哈希值。
所以“散列”存储在数据库中。“expectedPassword”是他们刚刚输入的登录密码。您不要存储那个密码。