使用BCrypt的一个C#实现来散列密码并将它们存储到SQL数据库中。但是,当我返回验证哈希字符串时,BCrypt会生成与数据库中要比较的哈希值不同的哈希值。盐与这些因素明显相同。
这就是我所知道的
$ 2a $ 12 $ vF / 1s3MqIzHwnDshyzH / rOYUelofrj4UWv./ vzWqk4o2K0uwhix7W实际上是“Qwerty123”并且存储在一个初始化为[nvarchar](200)的列中。
当我根据实现使用BCrypt.Verify()或BCrypt.CheckPassword()时,我会跟踪它直到它进行比较之前,它要与之前提到的哈希相比的哈希是$ 2a $ 12 $室颤/ 1s3MqIzHwnDshyzH / rOKVRePZSXFXaIpDv6.IPkbPEoOxZgSEe
如果仔细观察,可以看到盐和因子部分是相同的。知道是什么导致了这个吗?
我正在使用的显式实现可以在http://bcrypt.codeplex.com/
找到 有关答案 0 :(得分: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实际上不是问题。
答案 1 :(得分:1)
问题是Bcrypt的输入。我使用Multiview和MultiViewPanel来收集用户数据(其中包含密码),允许用户验证所有数据,然后在最后一个MultiViewPanel上将用户添加到数据库中,并在该过程中有回发。经过一些研究后,我发现由于安全原因,密码字段在回发后不会保留其文本属性,因为我将txtPassword.text传递给Bcrypt,这就是问题所在。这让我有一个新问题需要研究。