Subscribe Now

Trending News

Bài viết

ASP.NET, Lập trình

Kỹ thuật “hashing” cùng với “salt” để bảo mật Password trong ASP.NET C#

Kỹ thuật “hashing” cùng với “salt” để bảo mật Password trong ASP.NET C#

Trong ASP.NET C# Webform, để lưu mật khẩu một cách an toàn và đảm bảo tính bảo mật, bạn nên sử dụng một kỹ thuật được gọi là “hashing” cùng với “salt”. Dưới đây là một số bước và giải pháp bạn có thể thực hiện:

  1. Hashing Mật khẩu:
    • Sử dụng một thuật toán hash mạnh mẽ như bcrypt, Argon2, hoặc PBKDF2.
    • Hash mật khẩu trước khi lưu nó vào cơ sở dữ liệu.
  2. Sử dụng Salt:
    • Tạo một salt ngẫu nhiên duy nhất cho mỗi người dùng và lưu nó cùng với mật khẩu hash.
    • Khi kiểm tra mật khẩu, sử dụng cả salt và mật khẩu người dùng để tạo hash và so sánh với hash lưu trữ trong cơ sở dữ liệu.

Dưới đây là một ví dụ về cách bạn có thể thực hiện điều này trong ASP.NET C#:

public static class PasswordHelper
{
    public static string HashPassword(string password, out string salt)
    {
        // Tạo một salt ngẫu nhiên
        byte[] saltBytes = new byte[16];
        using (var rng = new RNGCryptoServiceProvider())
        {
            rng.GetBytes(saltBytes);
        }
        salt = Convert.ToBase64String(saltBytes);

        // Kết hợp salt với mật khẩu và hash
        using (var hasher = new Rfc2898DeriveBytes(password, saltBytes, 10000, HashAlgorithmName.SHA256))
        {
            byte[] hashBytes = hasher.GetBytes(32); // 32 bytes = 256 bits
            return Convert.ToBase64String(hashBytes);
        }
    }

    public static bool VerifyPassword(string enteredPassword, string storedHash, string storedSalt)
    {
        // Decode salt và mật khẩu đã nhập
        byte[] saltBytes = Convert.FromBase64String(storedSalt);

        // Tạo hash từ mật khẩu đã nhập và salt, và so sánh với hash lưu trữ
        using (var hasher = new Rfc2898DeriveBytes(enteredPassword, saltBytes, 10000, HashAlgorithmName.SHA256))
        {
            byte[] enteredHashBytes = hasher.GetBytes(32);
            string enteredHash = Convert.ToBase64String(enteredHashBytes);
            return storedHash == enteredHash;
        }
    }
}

Khi lưu mật khẩu vào cơ sở dữ liệu, bạn có thể sử dụng hàm HashPassword và lưu cả hash và salt vào cơ sở dữ liệu. Khi kiểm tra mật khẩu, bạn sử dụng hàm VerifyPassword để so sánh mật khẩu nhập vào với hash lưu trữ và salt.

// Đối với việc lưu mật khẩu mới
string password = "Password123";
string salt;
string hashedPassword = PasswordHelper.HashPassword(password, out salt);

// Lưu hashedPassword và salt vào cơ sở dữ liệu

// Đối với việc kiểm tra mật khẩu
string enteredPassword = "Password123"; // Mật khẩu người dùng nhập vào
bool passwordMatch = PasswordHelper.VerifyPassword(enteredPassword, storedHashFromDatabase, storedSaltFromDatabase);

Lưu ý rằng càng lớn giá trị của tham số 10000 trong hàm Rfc2898DeriveBytes, thì quá trình hash càng lâu, từ đó làm tăng độ bảo mật. Tuy nhiên, bạn cũng cần cân nhắc về hiệu suất khi chọn giá trị này.

Bài viết liên quan

Theo dõi
Thông báo của
guest

0 Góp ý
Phản hồi nội tuyến
Xem tất cả bình luận