我使用以下代码创建了哈希密码和salt:
// generate a 128-bit salt using a secure PRNG
byte[] salt = new byte[128 / 8];
using (var rng = RandomNumberGenerator.Create())
{
rng.GetBytes(salt);
}
// derive a 256-bit subkey (use HMACSHA1 with 10,000 iterations)
string hashedPassword = Convert.ToBase64String(KeyDerivation.Pbkdf2(
password: password,
salt: salt,
prf: KeyDerivationPrf.HMACSHA1,
iterationCount: 10000,
numBytesRequested: 256 / 8));
我将HashedPassword和Salt存储在数据库中。
现在我想在用户登录时验证密码:
public bool VerifyPassword(string userEnteredPassword, string dbPasswordHash, string dbPasswordSalt)
{
string hashedPassword = Convert.ToBase64String(KeyDerivation.Pbkdf2(
password: userEnteredPassword,
salt: Encoding.ASCII.GetBytes(dbPasswordSalt),
prf: KeyDerivationPrf.HMACSHA1,
iterationCount: 10000,
numBytesRequested: 256 / 8));
return dbPasswordHash == hashedPassword;
}
这不起作用,我得到一个与存储在数据库中的密码完全不同的哈希密码。根据我的理解,您应该将salt添加到用户登录时输入的密码,然后运行相同的Hash密码功能。以上不等于那个吗?
答案 0 :(得分:0)
正如Maarten Bodewes所述,ASCII是问题所在。下面的代码返回true。我所做的只是将var data =
{
"statecode": 1,
"*_myprefix_mylookupfieldname_value*": null
}
Xrm.WebApi.updateRecord("*entityName*", *recordId*, data);
更改为salt: Encoding.ASCII.GetBytes(dbPasswordSalt),
salt: System.Convert.FromBase64String(dbPasswordSalt),
答案 1 :(得分:0)
使用以下代码创建盐:
byte[] salt = new byte[128 / 8];
using (var rng = RandomNumberGenerator.Create())
{
rng.GetBytes(salt);
}
return Convert.ToBase64String(salt);
然后使用该盐创建一个哈希密码。
string hashed = Convert.ToBase64String(KeyDerivation.Pbkdf2(
password: password,
salt: salt,
prf: KeyDerivationPrf.HMACSHA1,
iterationCount: 10000,
numBytesRequested: 256 / 8));
保存在某处使用的盐(例如:数据库) 保存该用户的哈希密码。