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