553
Chương 14: Mật mã
Lớp trừu tượng
HashAlgorithm
cung cấp lớp cơ sở để tất cả các hiện thực giải thuật băm cụ
thể dẫn xuất từ đó. Thư viện lớp .NET Framework có sáu hiện thực giải thuật băm cụ thể
(được liệt kê trong bảng 14.1), mỗi lớp hiện thực là một thành viên của không gian tên
System.Security.Cryptography
. Các lớp với phần đuôi là
CryptoServiceProvider
bọc lấy các
chức năng do Win32 CryptoAPI cung cấp, trong khi các lớp với phần đuôi là
Managed
được
hiện thực hoàn toàn bằng mã lệnh được-quản-lý.
Bảng 14.1 Các hiện thực giải thuật băm
Tên giải thuật
Tên lớp
Kích thước mã băm (bit)
MD5
MD5CryptoServiceProvider
128
SHA hay SHA1
SHA1CryptoServiceProvider
160
SHA1Managed
SHA1Managed
160
SHA256 hay SHA-256
SHA256Managed
256
SHA384 hay SHA-384
SHA384Managed
384
SHA512 hay SHA-512
SHA512Managed
512
Mặc dù bạn có thể trực tiếp tạo ra thể hiện của các lớp giải thuật băm, lớp cơ sở
HashAlgorithm
là một factory cho các lớp hiện thực dẫn xuất từ nó. Gọi phương thức tĩnh
HashAlgorithm.Create
với đối số là tên giải thuật sẽ trả về một đối tượng thuộc kiểu đã được
chỉ định. Sử dụng factory cho phép bạn ghi mã lệnh tổng quát và mã lệnh này có thể làm việc
với bất kỳ hiện thực giải thuật băm nào.
Một khi bạn đã có đối tượng
HashAlgorithm
, phương thức
ComputeHash
của nó nhận một mảng
byte chứa plaintext và trả về một mảng byte mới chứa mã băm được tạo ra. Bảng 14.1 cho biết
kích thước của mã băm (tính bằng bit) được tạo ra bởi mỗi lớp giải thuật băm.
Lớp
HashPasswordExample
dưới đây trình bày cách tạo mã băm từ một chuỗi (password chẳng
hạn). Ứng dụng này cần hai đối số dòng lệnh: tên của giải thuật băm cần sử dụng và chuỗi cần
tạo mã băm. Vì phương thức
HashAlgorithm.ComputeHash
yêu cầu một mảng byte nên trước
hết bạn phải mã hóa chuỗi nhập bằng lớp
System.Text.Encoding
(lớp này cung cấp các cơ chế
dùng để chuyển chuỗi thành/từ các định dạng mã hóa ký tự khác nhau).
using System;
using System.Text;
using System.Security.Cryptography;
public class HashPasswordExample {
public static void Main(string[] args) {
// Tạo HashAlgorithm của kiểu được chỉ định bởi
// đối số dòng lệnh thứ nhất.
using (HashAlgorithm hashAlg = HashAlgorithm.Create(args[0])) {