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

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ả.

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.