在我的数据库中保留散列密码,而不是原始密码,对吧?那么我该如何使用BCrypt.Net.BCrypt

本文关键字:密码 BCrypt Net 何使用 对吧 保留 数据库 我的 原始 | 更新日期: 2023-09-27 18:29:50

每次使用:

BCrypt.HashPassword(password, 12)

它给了我不同的输出。根据我所读到的,为了检查登录细节,我必须有密码本身:

BCrypt.Verify(expectedPassword , hashed);

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

在我的数据库中保留散列密码,而不是原始密码,对吧?那么我该如何使用BCrypt.Net.BCrypt

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

我想我应该在数据库中只保存散列,而不是密码本身。

根据我们的在线聊天,我们澄清了您查询的问题,一般流程如下:

  • 在创建(或更改)密码的过程中,明文形式的密码将以明文形式进入系统
  • 然后在内存中对其进行散列运算
  • 然后将该哈希值保存在数据库中

稍后。。。

  • 当用户希望通过身份验证时,他们会输入自己的密码
  • 此密码以纯文本形式进入系统
  • 然后在内存中对其进行散列运算
  • 然后将此哈希值与密码中保存的上一个哈希值进行比较

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

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

在代码中

BCrypt.Verify(expectedPassword,hashed);

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

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

所以"hashed"存储在数据库中。"expectedPassword"是他们刚输入的登录密码。您不存储该密码。