556
Chương 14: Mật mã
Bạn có thể sử dụng mã băm để xác định hai mẩu dữ liệu có giống nhau hay không, để không
phải lưu trữ hay duy trì việc truy xuất đến dữ liệu gốc. Để xác định dữ liệu có thay đổi theo
thời gian hay không, bạn phải tạo và lưu trữ mã băm của dữ liệu gốc. Sau đó, hãy tạo một mã
băm khác cho dữ liệu này rồi so sánh mã băm cũ và mới để cho thấy có thay đổi nào xảy ra
hay không. Định dạng của mã băm gốc sẽ xác định cách thức phù hợp nhất để kiểm tra mã
băm mới được tạo.
Nhiều mục trong chương này sử dụng phương thức
ToString
của lớp
System.BitConverter
để chuyển mảng byte thành giá trị chuỗi thập lục phân khi
hiển thị. Mặc dù dễ sử dụng và thích hợp cho mục đích hiển thị, bạn có thể nhận
thấy cách này không phù hợp khi lưu trữ mã băm vì nó đặt dấu gạch nối (-) giữa
mỗi giá trị byte (ví dụ,
4D-79-3A-C9-
…). Ngoài ra, lớp
BitConverter
không cung
cấp phương thức nào để phân tích một biểu diễn chuỗi như thế trở về một mảng
byte.
Mã băm thường được lưu trữ trong file text ở dạng chuỗi thập lục phân (ví dụ,
89D22213170A9CFF09A392F00E2C6C4EDC1B0EF9
) hoặc chuỗi được mã hóa theo Base64 (ví dụ,
idIiExcKnP8Jo5LwDixsTtwbDvk=
). Mã băm cũng có thể được lưu trữ trong cơ sở dữ liệu ở dạng
giá trị byte thô. Bất kể bạn lưu trữ mã băm theo cách nào, bước đầu tiên khi so sánh mã băm
cũ và mới là đưa chúng về một dạng chung.
Đoạn mã dưới đây chuyển mã băm mới (mảng byte) thành chuỗi thập lục phân khi so sánh với
mã băm cũ. Ngoài phương thức
BitConverter.ToString
mà chúng ta đã thảo luận ở trên, thư
viện lớp .NET Framework không cung cấp phương thức nào để chuyển một mảng byte thành
chuỗi thập lục phân. Bạn phải viết một vòng lặp đi qua các phần tử của mảng byte, chuyển
mỗi byte thành chuỗi, và gắn chuỗi này vào biểu diễn chuỗi thập lục phân của mã băm. Sử
dụng
System.Text.StringBuilder
sẽ tránh tạo ra các chuỗi mới không cần thiết mỗi khi vòng
lặp gắn giá trị byte kế tiếp vào chuỗi kết quả (xem mục 2.1 để biết thêm chi tiết).
// Phương thức dùng để so sánh mã băm mới với
// mã băm có sẵn (được biểu diễn ở dạng chuỗi thập lục phân).
private static bool VerifyHexHash(byte[] hash, string oldHashString) {
// Tạo biểu diễn chuỗi cho mã băm mới.
System.Text.StringBuilder newHashString =
new System.Text.StringBuilder(hash.Length);
foreach (byte b in hash) {
newHashString.AppendFormat("{0:X2}", b);
}
// So sánh biểu diễn chuỗi của mã băm cũ và mới,
// và trả về kết quả.