HÀM BĂM (HASH FUNCTION) – "DẤU VÂN TAY" CỦA DỮ LIỆU

Ở Bài 2, chúng ta đã nắm giữ chiếc chìa khóa vạn năng: Cặp khóa Public Key & Private Key.

Tuy nhiên, trong thực tế, một file hợp đồng PDF hay một video bài giảng có thể dung lượng lên đến hàng trăm Megabyte (MB). Nếu chúng ta mang toàn bộ dữ liệu khổng lồ đó đi tính toán số học RSA để ký số, máy tính sẽ bị quá tải và mất rất nhiều thời gian.

Để giải quyết vấn đề này, các kỹ sưcntt sử dụng một công cụ siêu nhanh: Hàm Băm (Hash Function).

1. KHÁI NIỆM (CONCEPT)

Hàm băm (Hash Function) là một thuật toán toán học giúp biến đổi một dữ liệu đầu vào có độ dài bất kỳ (1 từ, 1 cuốn sách, hay 1 bộ phim 4K) thành một chuỗi ký tự có độ dài cố định (thường gọi là Mã băm - Hash value hoặc Digest).

 ┌────────────────────────────────────────┐
 │   DỮ LIỆU ĐẦU VÀO (Độ dài bất kỳ)      │
 │   - Một từ: "Hello"                    │
 │   - Một file Word: 50 trang            │ ────► [ HÀM BĂM SHA-256 ]
 │   - Một file Video: 2 GB               │
 └────────────────────────────────────────┘
                                                              │
                                                              ▼
                                           ┌────────────────────────────────────┐
                                           │   MÃ BĂM DẦU RA (Độ dài cố định)   │
                                           │   Luôn luôn là 64 ký tự Hexa       │
                                           │   (256 bits)                       │
                                           └────────────────────────────────────┘

💡 3 Tính chất "vàng" của Hàm băm dùng trong bảo mật:

  1. Tính một chiều (One-way): Dễ dàng tính Mã băm từ Dữ liệu gốc, nhưng không thể từ Mã băm để khôi phục lại Dữ liệu gốc.

  2. Tính cố định độ dài (Fixed Length): Dù đầu vào ngắn 1 chữ hay dài 1 triệu chữ, Mã băm đầu ra luôn có độ dài chuẩn (ví dụ SHA-256 luôn ra chuỗi 64 ký tự Hex).

  3. Hiệu ứng vết tuyết lở (Avalanche Effect): Chỉ cần thay đổi dù chỉ 1 dấu chấm hay 1 chữ hoa/thường ở đầu vào, mã băm đầu ra sẽ bị xáo trộn và thay đổi hoàn toàn!

2. VÍ DỤ THỰC TẾ & BÀI TOÁN ĐẶT RA (REAL-WORLD EXAMPLE)

🖐️ Tại sao gọi Mã Băm là "Dấu vân tay của dữ liệu"?

Hãy tưởng tượng trong một vụ án:

  • Cảnh sát không thể mang toàn bộ cơ thể của một nghi phạm đi khắp nơi để so sánh. Thay vào đó, họ chỉ cần lăn dấu vân tay của người đó lên thẻ bài.

  • Dấu vân tay rất nhỏ gọn, nhưng nó là duy nhất cho mỗi người.

  • Nếu hai dấu vân tay trùng khớp $\rightarrow$ Hai người đó là một!

Mã băm chính là "Dấu vân tay" của dữ liệu số:

  • Bạn có một cuốn sách dày 1.000 trang (Dữ liệu gốc).

  • Bạn đưa cuốn sách qua hàm băm SHA-256 $\rightarrow$ Thu được mã băm: a7f9...3b21 (Dấu vân tay).

  • Nếu ai đó âm thầm thêm một dấu phẩy vào trang 500 của cuốn sách, "dấu vân tay" mới lập tức biến thành 9e2c...11a0. Người kiểm tra biết ngay cuốn sách đã bị sửa đổi!

3. GIẢI THÍCH CHI TIẾT (EXPLANATION)

Tại sao Hàm băm lại đóng vai trò sinh tử trong Chữ ký số?

Quay lại bài toán ký số cho file dung lượng lớn:

❌ CÁCH LÀM CHẬM (Không dùng Hàm băm):
 [File PDF 100MB] ──► [Tính toán RSA từng bit bằng Private Key] ──► Mất 30 phút! 🐢

 ✅ CÁCH LÀM TỐI ƯU (Có dùng Hàm băm):
 1. [File PDF 100MB] ──► [Hàm băm SHA-256] ──► [Mã băm 64 ký tự] (Mất 0.01 giây)
 2. [Mã băm 64 ký tự] ──► [Ký RSA bằng Private Key] ──► [CHỮ KÝ SỐ] (Mất 0.001 giây) 🚀

Quy trình hợp nhất: Khi bạn ký số một file, bạn không ký trực tiếp lên file đó, mà bạn đang ký lên Mã băm (dấu vân tay) của file đó!

4. MINH HỌA BẰNG PYTHON CƠ BẢN (PURE PYTHON)

Để thực hành phần này, chúng ta sử dụng thư viện hashlib – một thư viện tiêu chuẩn có sẵn 100% trong Python (không cần cài đặt gì thêm).

import hashlib

# =====================================================================
# BÀI 3: MINH HỌA HÀM BĂM SHA-256 VÀ HIỆU ỨNG THAY ĐỔI DỮ LIỆU
# =====================================================================

# 1. Khởi tạo 2 văn bản gần giống hệt nhau (chỉ khác 1 ký tự viết hoa/thường)
text_1 = "Toi dong y chuyen 10 trieu"
text_2 = "toi dong y chuyen 10 trieu" # Chữ 'T' viết thường

# 2. Tính mã băm SHA-256 cho văn bản 1
hash_obj_1 = hashlib.sha256(text_1.encode('utf-8'))
hash_hex_1 = hash_obj_1.hexdigest()

# 3. Tính mã băm SHA-256 cho văn bản 2
hash_obj_2 = hashlib.sha256(text_2.encode('utf-8'))
hash_hex_2 = hash_obj_2.hexdigest()

print("📄 Văn bản 1:", text_1)
print("🔑 Mã băm 1 :", hash_hex_1)
print("-" * 65)

print("📄 Văn bản 2:", text_2)
print("🔑 Mã băm 2 :", hash_hex_2)
print("-" * 65)

# 4. Kiểm tra độ dài mã băm
print(f"📏 Độ dài chuỗi Mã băm luôn là: {len(hash_hex_1)} ký tự Hexa (256 bits)")

# 5. So sánh 2 mã băm
if hash_hex_1 != hash_hex_2:
    print("⚡ BÁO ĐỘNG: Chỉ thay đổi 1 chữ cái, mã băm đã bị xáo trộn HOÀN TOÀN!")

Kết quả khi chạy chương trình:

📄 Văn bản 1: Toi dong y chuyen 10 trieu
🔑 Mã băm 1 : a8f8a3c8e4745814e590483863d0df608d6d2a792d7bc9e0571168f0291df131
-----------------------------------------------------------------
📄 Văn bản 2: toi dong y chuyen 10 trieu
🔑 Mã băm 2 : 5529f7f4aa4d9c72e293a5a73a3df1c2d3cf83aa4294b0d015c92c8bb8076632
-----------------------------------------------------------------
📏 Độ dài chuỗi Mã băm luôn là: 64 ký tự Hexa (256 bits)
⚡ BÁO ĐỘNG: Chỉ thay đổi 1 chữ cái, mã băm đã bị xáo trộn HOÀN TOÀN!
 

5. TÓM TẮT & BÀI TẬP BỎ TÚI

Bảng tóm tắt các thuật toán Băm phổ biến:

Thuật toán Băm Độ dài mã băm Trạng thái an toàn hiện nay
MD5 128 bits (32 ký tự) ❌ Không an toàn (Đã bị bẻ khóa, dễ đụng độ)
SHA-1 160 bits (40 ký tự) ❌ Không an toàn (Nhiều lỗ hổng)
SHA-256 256 bits (64 ký tự) ✅ Cực kỳ an toàn (Tiêu chuẩn quốc tế hiện nay)
SHA-512 512 bits (128 ký tự) ✅ Cực kỳ an toàn (Dùng cho dữ liệu siêu bảo mật)

✏️ CÂU HỎI BÀI TẬP 

Câu hỏi: Giả sử bạn có mã băm SHA-256 của một file bài tập là a8f8a3...df131. Bạn có thể dùng một công cụ dịch ngược nào đó để khôi phục lại nội dung file bài tập ban đầu từ mã băm đó không? Tại sao?

Đáp án:

    • Không thể! Vì hàm băm là thuật toán một chiều (One-way function). Trong quá trình băm, thông tin chi tiết đã bị nén và triệt tiêu để thu về độ dài cố định 256-bit, nên không tồn tại công thức toán học nào để "dịch ngược" ra dữ liệu ban đầu.*

Chúng ta đã có đầy đủ 3 mảnh ghép quan trọng nhất: Chữ ký số (Bài 1) + Cặp khóa Public/Private (Bài 2) + Hàm băm (Bài 3).