0

每次我使用:

BCrypt.HashPassword(password, 12)

它给了我不同的输出。根据我的阅读,为了检查登录详细信息,我必须拥有密码本身:

BCrypt.Verify(expectedPassword , hashed);

所以我很困惑:我认为我应该只在我的数据库中保留哈希,而不是密码本身。我错过了什么?

4

2 回答 2

1

当您声明时,您是 100% 正确的:

我想我应该只在我的数据库中保留哈希,而不是密码本身。

继我们的在线聊天之后,我们澄清了您所查询的问题,一般流程如下:

  • 在创建(或更改)密码的过程中,密码(以纯文本形式)以纯文本形式进入系统。
  • 然后在内存中对其进行哈希处理。
  • 然后将此哈希值保存在数据库中。

稍后的 ...

  • 当用户希望被认证时,他们输入他们的密码。
  • 此密码以纯文本形式进入系统。
  • 然后在内存中对其进行哈希处理。
  • 然后将此哈希值与密码中保存的先前哈希值进行比较。

需要注意的重要一点是,对于给定的哈希算法,两个相同的字符串将始终哈希为相同的值,因此这种比较是安全的。

当仍在内存中时,允许密码为纯文本是标准的。理论上可以在它到达服务器之前对其进行加密(例如,如果存在用 JavaScript 编写的 SHA-512 程序在密码提交之前对其进行哈希处理,我不会感到惊讶),但这通常甚至超出了最复杂的安全要求。

于 2013-09-02T15:55:46.170 回答
0

在代码中

BCrypt.Verify(expectedPassword , hashed);

您使用名称“expectedPassword”,我想知道这是否表明您的误解。这不是您希望用户输入的密码。那是他们试图用来登录的纯文本密码。

第二个参数,hashed,是他们的“官方”密码(即他们注册的密码)的哈希值。

所以“散列”存储在数据库中。“expectedPassword”是他们刚刚输入的登录密码。您不要存储那个密码。

于 2013-09-02T13:01:57.643 回答