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

时间:2013-09-02 12:20:30

标签: c# security bcrypt.net

每次我使用:

BCrypt.HashPassword(password, 12)
它给了我不同的输出。根据我的阅读,为了检查登录详细信息,我必须拥有密码:

BCrypt.Verify(expectedPassword , hashed);

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

2 个答案:

答案 0 :(得分:1)

当你陈述时,你是100%正确的:

  

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

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

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

稍后......

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

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

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

答案 1 :(得分:0)

在代码中

BCrypt.Verify(expectedPassword,hashed);

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

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

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