2

使用 BCrypt 的 C# 实现之一对密码进行哈希处理并将其存储到 SQL 数据库中。但是,当我返回验证哈希字符串时,BCrypt 生成的哈希值与数据库中要比较的哈希值不同。盐和因素明显相同。

这是我所知道的

$2a$12$vF/1s3MqIzHwnDshyzH/rOYUelofrj4UWv./vzWqk4o2K0uwhix7W 实际上是“Qwerty123”,它存储在一个初始化为 [nvarchar] (200) 的列中。

当我根据实现使用 BCrypt.Verify() 或 BCrypt.CheckPassword() 时,我会跟踪它直到它进行比较之前,它要与前面提到的比较的哈希是 $2a$12$vF /1s3MqIzHwnDshyzH/rOKVRePZSXFXaIpDv6.IPkbPEoOxZgSEe

如果您仔细观察,您会发现盐和因子部分是相同的。知道是什么原因造成的吗?

我正在使用的显式实现可以在这里找到http://bcrypt.codeplex.com/

我的问题可能与ASP.NET MVC 3 应用程序 BCrypt.CheckPassword 失败有关

4

2 回答 2

2

测试建议

private void FindWhatsFailing(string password) //password = Whatever you're passing in to verify BCrypt is working
{
  const string expectedpassword = "Qwerty123";
  if(expectedpassword != password)
  {
      Debug.WriteLine("My password isn't what I thought it was");
      return;
  }
  string hashed = BCrypt.HashPassword(expectedpassword , BCrypt.GenerateSalt(12));
  if(!BCrypt.Verify(expectedpassword , hashed))
  {
     Debug.WriteLine("Something is wrong with BCrypt");
     return;
  }

  /// ... Test hashing password, compare to hash of expectedpassword, verify password against hash of itself and expectedpassword

 Debug.WriteLine("Everything worked, maybe the database storage is off?");
}

如果 Bcrypt.Verify 在此示例中对您不起作用,我不知道出了什么问题,但我猜 Bcrypt 实际上不是这里的问题。

于 2011-07-01T00:00:04.943 回答
1

问题在于 Bcrypt 的输入。我使用 Multiview 和 MultiViewPanels 来收集用户数据(其中有密码),允许用户验证所有数据,然后在最后一个 MultiViewPanel 上将用户添加到数据库中,并且在该过程中有回发。经过一些研究,我发现出于安全原因,密码字段在回发后不会保留其文本属性,并且因为我将 txtPassword.text 传递给 Bcrypt,这就是问题所在。这给我带来了一个需要研究的新问题。

于 2011-07-01T16:02:40.110 回答