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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Pbkdf2加密加密和验证使用Salt的哈希密码相关的知识,希望对你有一定的参考价值。

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

答案

正如Maarten Bodewes所说,ASCII就是问题所在。以下代码返回true。所有我改变的是salt: Encoding.ASCII.GetBytes(dbPasswordSalt),salt: System.Convert.FromBase64String(dbPasswordSalt),

public bool VerifyPassword(string userEnteredPassword, string dbPasswordHash, string dbPasswordSalt)
    
        Console.WriteLine(dbPasswordSalt.ToString());
        Console.WriteLine(dbPasswordHash.ToString());

        string hashedPassword = Convert.ToBase64String(KeyDerivation.Pbkdf2(
            password: userEnteredPassword,
            salt: System.Convert.FromBase64String(dbPasswordSalt),///Encoding.ASCII.GetBytes(dbPasswordSalt),
            prf: KeyDerivationPrf.HMACSHA1,
            iterationCount: 10000,
            numBytesRequested: 256 / 8));
        Console.WriteLine(hashedPassword.ToString());
        return dbPasswordHash == hashedPassword;
    

以上是关于使用Pbkdf2加密加密和验证使用Salt的哈希密码的主要内容,如果未能解决你的问题,请参考以下文章

使用 pbkdf2 的 SALT 和 HASH

PBKDF2加密

在 Java 中使用 PBKDF2 进行密码验证

解码哈希sha256加密,知盐

FabricV2.2中使用的密码学算法和国密算法对应关系

转载 C#使用Salt + Hash来为密码加密