Nếu bạn chỉ định xác minh / xác thực tên người dùng và mật khẩu đã nhập, hãy sử dụng lớp Rfc2898DerivedBytes (còn được gọi là Chức năng lấy lại khóa dựa trên mật khẩu 2 hoặc PBKDF2). Điều này an toàn hơn so với việc sử dụng mã hóa như Triple DES hoặc AES vì không có cách thực tế nào để chuyển từ kết quả của RFC2898DerivedBytes trở lại mật khẩu. Bạn chỉ có thể đi từ mật khẩu đến kết quả. Xem Sử dụng hàm băm SHA1 của mật khẩu làm muối khi lấy khóa mã hóa và IV từ chuỗi mật khẩu có được không? cho một ví dụ và thảo luận cho .Net hoặc Chuỗi mã hóa / giải mã bằng mật khẩu c # Metro Style cho WinRT / Metro.
Nếu bạn đang lưu trữ mật khẩu để sử dụng lại, chẳng hạn như cung cấp mật khẩu cho bên thứ ba, hãy sử dụng API bảo vệ dữ liệu của Windows (DPAPI) . Điều này sử dụng các khóa được tạo và bảo vệ của hệ điều hành cũng như thuật toán mã hóa Triple DES để mã hóa và giải mã thông tin. Điều này có nghĩa là ứng dụng của bạn không phải lo lắng về việc tạo và bảo vệ các khóa mã hóa, một mối quan tâm chính khi sử dụng mật mã.
Trong C #, sử dụng lớp System.Security.Cryptography.ProtectedData . Ví dụ: để mã hóa một phần dữ liệu, hãy sử dụng ProtectedData.Protect()
:
// Data to protect. Convert a string to a byte[] using Encoding.UTF8.GetBytes().
byte[] plaintext;
// Generate additional entropy (will be used as the Initialization vector)
byte[] entropy = new byte[20];
using(RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
{
rng.GetBytes(entropy);
}
byte[] ciphertext = ProtectedData.Protect(plaintext, entropy,
DataProtectionScope.CurrentUser);
Lưu trữ entropy và bản mã một cách an toàn, chẳng hạn như trong tệp hoặc khóa đăng ký với các quyền được đặt để chỉ người dùng hiện tại mới có thể đọc được. Để có quyền truy cập vào dữ liệu gốc, hãy sử dụng ProtectedData.Unprotect()
:
byte[] plaintext= ProtectedData.Unprotect(ciphertext, entropy,
DataProtectionScope.CurrentUser);
Lưu ý rằng có những cân nhắc bảo mật bổ sung. Ví dụ: tránh lưu trữ bí mật như mật khẩu dưới dạng string
. Các chuỗi là bất biến, vì chúng không thể được thông báo trong bộ nhớ nên ai đó đang nhìn vào bộ nhớ của ứng dụng hoặc kết xuất bộ nhớ có thể thấy mật khẩu. Thay vào đó, hãy sử dụng SecureString hoặc một byte [] và nhớ loại bỏ hoặc loại bỏ chúng ngay khi không cần mật khẩu nữa.