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:
- 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.
- 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.
Theo dõi
0 Góp ý
Mới nhất