我正在创建一个小的C#WinForms应用程序,但在验证/验证散列密码时遇到了问题。验证散列密码
当用户被创建时,他们的密码被散列并存储在数据库中。我不知道如何将输入的密码(当用户登录时)与数据库中的散列密码进行比较。
代码来创建哈希低于:
private static string CreateHashedPassword(string username, string plainTextPassword)
{
byte[] salt;
new System.Security.Cryptography.RNGCryptoServiceProvider().GetBytes(salt = new byte[16]);
System.Security.Cryptography.Rfc2898DeriveBytes pbkdf2 = new System.Security.Cryptography.Rfc2898DeriveBytes(plainTextPassword, salt, 3000);
byte[] hash = pbkdf2.GetBytes(20);
byte[] hashBytes = new byte[36];
Array.Copy(salt, 0, hashBytes, 0, 16);
Array.Copy(hash, 0, hashBytes, 16, 20);
return Convert.ToBase64String(hashBytes);
}
当用户试图登录,我再次调用此方法来获取哈希密码进行比较的数据库,但它永远不会匹配。
我敢肯定,这是因为新的盐是每个方法运行时创建的,所以我敢肯定的方式来解决它(但我不知道如何)是两种:
保存在数据库中的盐或
使用类似的用户名来创建盐。这是首选的方法,但我不知道如何从预先确定的字符串(如用户名)中派生盐。
任何想法/指针?谢谢!
你在做从头定制认证/授权或您使用的一些图书馆为此目的? –
那么你实施了哪一个,你遇到了什么问题? –
下面是一个链接,以便我使用pbkdf2为密码散列/比较器创建完整解决方案:[使用Pbkdf2的完整密码散列解决方案](https://stackoverflow.com/documentation/c%23/2774/哈希函数/ 15470 /完整密码哈希解决方案使用pbkdf2#t = 20170611103527142945) – Igor