552
Chương 14: Mật mã
Những nỗ lực tính toán cần thiết để tạo một số ngẫu nhiên với
RNGCryptoServiceProvider
lớn hơn nhiều so với
Random
. Đối với mục đích thường
ngày, sử dụng
RNGCryptoServiceProvider
là quá mức cần thiết. Bạn nên xem xét
số lượng số ngẫu nhiên cần tạo và mục đích của các số này trước khi quyết định
sử dụng
RNGCryptoServiceProvider
. Sử dụng lớp
RNGCryptoServiceProvider
quá
mức và không cần thiết có thể ảnh hưởng đáng kể lên hiệu năng của ứng dụng.
2.
2.
Tính mã băm c a password
ủ
Tính mã băm c a password
ủ
Bạn cần lưu trữ password của người dùng một cách an toàn để bạn có thể sử
dụng nó để xác thực người dùng đó trong tương lai.
Đừng lưu trữ password của người dùng ở dạng plaintext vì đây là một nguy cơ
bảo mật lớn. Thay vào đó, hãy tạo và lưu trữ một mã băm của password bằng
một
lớp
giải
thuật
băm
dẫn
xuất
từ
lớp
System.Security.Cryptography.HashAlgorithm
. Khi xác thực, tạo mã băm của
password và so sánh nó với mã băm đã được lưu trữ.
Các giải thuật băm là các hàm mật mã một chiều, nhận plaintext có chiều dài thay đổi và tạo
một giá trị số có kích thước cố định. Chúng là một chiều vì gần như không thể tìm lại
plaintext gốc từ mã băm. Các giải thuật băm là tất định (deterministic); áp dụng cùng giải
thuật băm cho một mẩu plaintext luôn tạo ra cùng mã băm. Điều này khiến mã băm trở nên
hữu ích cho việc xác định hai khối plaintext (trong trường hợp này là password) có giống
nhau hay không. Mục đích của các giải thuật băm bảo đảm rằng—mặc dù không phải không
xảy ra—khả năng hai mẩu plaintext khác nhau tạo ra cùng mã băm là cực kỳ nhỏ. Ngoài ra,
không có mối tương quan nào giữa sự giống nhau của hai mẩu plaintext và mã băm của
chúng; một khác biệt nhỏ trong plaintext cũng có thể gây ra khác biệt đáng kể trong mã băm.
Khi sử dụng password để xác thực một người dùng, bạn không quan tâm đến nội dung của
password do người dùng nhập vào. Bạn chỉ cần biết rằng password được nhập trùng khớp với
password mà bạn đã ghi lại cho người dùng đó trong cơ sở dữ liệu tài khoản. Bản chất của các
giải thuật băm khiến chúng trở nên lý tưởng trong việc lưu trữ password một cách an toàn.
Khi người dùng cung cấp một password mới, bạn phải tạo mã băm của password và lưu trữ
mã băm này, rồi loại bỏ password dạng text. Mỗi khi người dùng xác thực với ứng dụng của
bạn, tính mã băm của password do người đó cung cấp và so sánh nó với mã băm mà bạn đã
lưu trữ.
Người ta thường hỏi cách thu lấy password từ một mã băm. Và câu trả lời là
không thể. Mục đích của mã băm là đóng vai trò như một token và bạn có thể
tùy ý lưu trữ nó mà không sinh ra lỗ hổng bảo mật nào. Nếu người dùng quên
password, bạn không thể tìm lại nó từ mã băm đã được lưu trữ; bạn phải reset
tài khoản này thành giá trị mặc định nào đó, hoặc tạo một password mới cho
người dùng.