簡體   English   中英

使用 Pbkdf2 加密使用 Salt 加密和驗證散列密碼

[英]Encrypting and Verifying a Hashed Password with Salt using Pbkdf2 Encryption

我正在使用以下代碼創建散列密碼和鹽:

// 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;
}

這不起作用,我得到的散列密碼與存儲在數據庫中的密碼完全不同。 據我了解,您應該在用戶登錄時輸入的密碼前添加鹽,然后運行相同的哈希密碼功能。 上面的不是等價的嗎?

  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. 驗證密碼
    • 檢索該用戶的鹽和散列密碼。
    • 使用檢索到的鹽和用戶輸入的密碼創建散列密碼。
    • 檢查新散列的密碼和存儲的密碼是否相同。

正如 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;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM