使用Pbkdf2加密加密和验证使用Salt的哈希密码

时间:2017-07-20 16:27:35

标签: c# encoding asp.net-core cryptography passwords

我使用以下代码创建了哈希密码和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密码功能。以上不等于那个吗?

2 个答案:

答案 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)

  1. 创建密码

使用以下代码创建盐:

    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));

保存在某处使用的盐(例如:数据库) 保存该用户的哈希密码。

  1. 验证密码
    • 检索该用户的盐和哈希密码。
    • 使用检索到的盐和用户输入的密码创建哈希密码。
    • 检查新哈希密码和存储的密码是否相同。