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

C# 在我的数据库中保留哈希密码,而不是原始密码,对吗?那么如何使用BCrypt.Net.BCrypt呢?,c#,security,bcrypt.net,C#,Security,Bcrypt.net,每次我使用: BCrypt.HashPassword(password, 12) 它给我不同的输出。据我所知,为了查看登录详细信息,我必须拥有密码本身: BCrypt.Verify(expectedPassword , hashed); 所以我很困惑:我想我应该在数据库中只保留哈希值,而不是密码本身。代码中缺少什么? BCrypt.Verify(预期密码,散列) 你使用“expectedPassword”这个名字,我想知道这是否表明你的误解。这不是您希望用户输入的密码。这是他们试图用来登录的

每次我使用:

BCrypt.HashPassword(password, 12)
它给我不同的输出。据我所知,为了查看登录详细信息,我必须拥有密码本身:

BCrypt.Verify(expectedPassword , hashed);
所以我很困惑:我想我应该在数据库中只保留哈希值,而不是密码本身。代码中缺少什么?

BCrypt.Verify(预期密码,散列)

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

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


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

如果您声明:

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

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

  • 在创建(或更改)密码的过程中,密码(纯文本)以纯文本形式进入系统
  • 然后将其散列到内存中
  • 然后将该散列值保存在数据库中
后来

  • 当用户希望通过身份验证时,他们会输入密码
  • 此密码以明文形式输入系统
  • 然后将其散列到内存中
  • 然后将此哈希值与密码中保存的上一个哈希值进行比较
需要注意的重要一点是,对于给定的哈希算法,两个相同的字符串将始终哈希为相同的值,因此这种比较是安全的


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

用户输入密码。然后散列它们并比较加密(直接或使用
BCrypt.Verify()进行)
@AdrianWragg,那么我必须在服务器中拥有密码本身?@Heslacher:这有关系吗?@Tal不,如果用户登录到您的系统,您永远不应该存储密码。用户每次登录时都提供纯文本密码,然后将其散列并与存储的散列进行比较。@AdrianWragg,那么
期望的密码是什么呢ssword
在我的问题中?是的,我不存储那个密码,但它确实通过电线/网络:用户将它传输到服务器,服务器得到这个密码。这就是我所困惑的-我天真地认为我键入的密码永远不会到达另一端(存储在DB中或仅仅是volatile中)理想情况下,您应该通过安全连接(如shttp或ssl)发送纯文本密码。如果不可能,您应该在发送密码之前对密码进行哈希运算。我不知道BCryPt是否为此提供了功能。它必须在客户端提供对salt的访问,以便您可以进行salt和哈希运算。如果它不支持此功能,您可以使用other工具,但这可能需要您手动创建salt值并将其存储在数据库中。(这不是什么大问题,但需要更多的工作。)客户端需要一种方法来重新获取salt,并使用服务器端使用的相同哈希算法。