CÁC GIẢI PHÁP LẬP TRÌNH C# - Trang 567

567

Chương 14: Mật mã

mỗi khi cần mật hóa hay giải mật hóa dữ liệu, người dùng chỉ cần nhập password và máy tính
sẽ tạo ra khóa (nếu người dùng nhập cùng password, giao thức này sẽ tạo ra cùng khóa).

Truy lại khóa từ những từ hay nhóm từ dễ nhớ làm giảm đáng kể tính ngẫu
nhiên của khóa, dẫn đến giảm tính bảo mật được cấp bởi những hàm mật mã có
sử dụng khóa đó. Trong trường hợp tồi tệ nhất, hacker có thể đoán được
password, và crack dữ liệu của bạn thông qua việc giải mã mật mã
(cryptanalysis
).

Thư viện lớp .NET Framework có một hiện thực truy lại khóa đối xứng:

PasswordDeriveBytes

. Lớp này sử dụng một giải thuật băm được áp dụng lặp đi lặp lại cho

một password để tạo ra một khóa với chiều dài như mong muốn. Khi cấu hình một đối tượng

PasswordDeriveBytes

, bạn có thể chỉ định tên giải thuật băm cũng như số lần lặp (mặc định,

SHA-1 được áp dụng 100 lần). Ngoài ra, bạn cũng cần cung cấp giá trị salt. Salt là dữ liệu
ngẫu nhiên mà quá trình truy lại khóa sẽ sử dụng để làm cho khóa tìm được trở nên bền vững
hơn đối với các dạng tấn công bằng mật mã. Bạn không cần giữ bí mật cho giá trị salt; bạn
phải lưu trữ và sử dụng nó khi truy lại khóa từ password sau này (nếu không có giá trị salt
đúng, bạn sẽ không thể truy lại khóa đúng và không thể giải mật hóa được).

Bạn không thể tạo khóa bất đối xứng bằng giao thức truy lại khóa. Giải thuật
mật hóa bất đối xứng (asymmetric encryption
) dựa vào các mối liên hệ toán cụ
thể giữa các thành phần khóa công khai (public key
) và khóa riêng (private key).
Như thế, mỗi giải thuật mật hóa bất đối xứng yêu cầu bạn phải tuân theo một
quy trình riêng để có thể tạo ra các khóa mới.

Ví dụ dưới đây trình bày cách sử dụng lớp

PasswordDeriveBytes

để tạo một khóa đối xứng

gồm 64 bit từ một chuỗi password. Ví dụ này yêu cầu hai đối số dòng lệnh: tên giải thuật băm
và password (tên của các giải thuật băm đã được liệt kê trong bảng 14.1).

using System;

using System;

using System.Security.Cryptography;

public class DerivedKeyExample {

public static void Main(string[] args) {

// Sử dụng một bộ tạo số ngẫu nhiên để tạo giá trị salt.

byte[] salt = new byte[8];

RandomNumberGenerator.Create().GetBytes(salt);

// Tạo một đối tượng PasswordDeriveBytes để tạo khóa từ

// password. Cần cung cấp password nguồn (là đối số dòng

// lệnh thứ hai) và salt.

PasswordDeriveBytes pdb =

Liên Kết Chia Sẽ

** Đây là liên kết chia sẻ bới cộng đồng người dùng, chúng tôi không chịu trách nhiệm gì về nội dung của các thông tin này. Nếu có liên kết nào không phù hợp xin hãy báo cho admin.