Loading...

Bài 10. Hashing, salting và chữ ký số — bảo vệ tính toàn vẹn dữ liệu

Khóa học CompTIA Security+ SY0-801 · Phần 1: Khái niệm bảo mật cốt lõi · Bài 10 · 🎯 Objective 1.3 · ⏱️ Đọc khoảng 14 phút · 🧪 Không cần lab · 📝 5 câu bài tập cuối bài

🎯 Mục tiêu bài học

  • Giải thích hàm băm (hash) và ba tính chất: một chiều, độ dài cố định, xác định.
  • Dùng hash để kiểm tra tính toàn vẹn của file.
  • Hiểu vì sao mật khẩu phải được lưu dưới dạng hash có salt và qua key stretching.
  • Mô tả cách chữ ký số hoạt động và nó mang lại những gì (toàn vẹn, xác thực, không thể chối bỏ).

📎 Vị trí trong đề thi: bài này nằm trong Objective 1.3 và nối tiếp Bài 9. Bài 9 bảo vệ bí mật. Bài 10 bảo vệ toàn vẹn và hỗ trợ không thể chối bỏ, hai chữ của bộ CIA ở Bài 2.

💡 Liên hệ thực tế: hai chuyện trong một ngày

Thứ Hai, 09:00. Một bản cập nhật lạ. Chị Lan tải bản cập nhật phần mềm kế toán từ một đường link nhận trong email. Trang của nhà cung cấp có ghi mã SHA-256 của file. Nam nhờ chị tính lại mã của file vừa tải. Hai mã khác nhau hoàn toàn. File đã bị sửa trên đường tải, hoặc link dẫn tới trang giả. Chị Lan xóa file và tải lại từ trang chính thức, lần này hai mã khớp. Đây là tình huống minh họa, không phải vụ việc có thật.

14:00. Cổng nội bộ cũ. Nam rà soát một cổng nhân sự cũ của công ty và thấy cơ sở dữ liệu lưu mật khẩu dưới dạng hash MD5 không salt. Anh thấy ba nhân viên có cùng một chuỗi hash, nghĩa là cả ba dùng cùng một mật khẩu. Kẻ tấn công lấy được cơ sở dữ liệu này chỉ cần tra bảng hash dựng sẵn là ra mật khẩu của cả ba người cùng lúc. Nam đề xuất đổi sang thuật toán băm mật khẩu chuyên dụng, có salt riêng cho từng người.

Hai chuyện này dùng cùng một công cụ ở hai chỗ khác nhau: hash giúp phát hiện sửa đổi, và hash (làm đúng cách) giúp lưu mật khẩu an toàn.

#️⃣ Hình 10a. Chỉ thêm một chữ số 0, hai hash khác nhau ở khoảng một nửa số bit. Đó là lý do hash phát hiện được mọi sửa đổi.

📘 Kiến thức cốt lõi

#️⃣ Hàm băm (hash)

Hàm băm (hash function) nhận dữ liệu có độ dài bất kỳ và trả về một chuỗi có độ dài cố định, gọi là giá trị băm (hash value, digest).

Tính chấtÝ nghĩa
Một chiều (one-way) Từ hash không suy ngược ra được dữ liệu gốc
Độ dài cố định SHA-256 luôn cho 256 bit, dù dữ liệu là một ký tự hay một file hàng gigabyte
Xác định (deterministic) Cùng dữ liệu luôn cho cùng hash
Hiệu ứng thác đổ (avalanche) Đổi một chút dữ liệu thì hash đổi gần như hoàn toàn (hình 10a)
Chống va chạm (collision resistance) Rất khó tìm hai dữ liệu khác nhau cho cùng một hash

Một điểm hay nhầm: hash không phải mã hóa. Mã hóa là hai chiều (có khóa thì giải mã được), còn hash là một chiều (không có "giải hash").

Thuật toánĐánh giá
SHA-256, SHA-512 (họ SHA-2) Đang được dùng rộng rãi, an toàn cho mục đích thông thường
SHA-3 Thế hệ mới, thiết kế khác SHA-2
MD5 Đã bị phá về va chạm, không dùng cho mục đích bảo mật
SHA-1 Đã bị phá về va chạm, không dùng cho mục đích bảo mật

Va chạm (collision) xảy ra khi hai dữ liệu khác nhau cho cùng một hash. Khi một thuật toán bị phá về va chạm, kẻ tấn công có thể tạo một file độc hại có hash trùng với file hợp lệ, làm hỏng lòng tin vào việc so sánh hash.

🎯 Mẹo làm bài: đề hỏi "kiểm tra file tải về có bị sửa không" thì đáp án là hash. Đề hỏi "bảo vệ bí mật nội dung file" thì đáp án là mã hóa. Đề hỏi "thuật toán không còn đủ an toàn" thường nhắm tới MD5 hoặc SHA-1.

🧂 Lưu mật khẩu: salting và key stretching

Hệ thống không nên lưu mật khẩu rõ. Thay vào đó nó lưu hash của mật khẩu. Khi bạn đăng nhập, hệ thống băm mật khẩu bạn gõ rồi so với hash đã lưu. Nhưng chỉ băm thuần là chưa đủ:

Vấn đềHệ quảCách chống
Hai người cùng mật khẩu thì cùng hash Lộ hàng loạt tài khoản, như ba nhân viên trong chuyện trên Salt: chuỗi ngẫu nhiên, riêng cho từng mật khẩu, trộn vào trước khi băm
Bảng hash dựng sẵn (rainbow table) Tra ngược hash ra mật khẩu rất nhanh Salt làm các bảng dựng sẵn vô dụng, vì mỗi salt cần một bảng riêng
Hash nhanh nên đoán vét cạn rất nhanh Kẻ tấn công thử hàng tỷ mật khẩu mỗi giây Key stretching: cố tình làm chậm bằng cách lặp nhiều vòng
  • Salt không cần giữ bí mật. Nó thường được lưu cạnh hash. Vai trò của nó là làm mỗi hash trở nên duy nhất và khiến việc tính trước trở nên vô ích.
  • Key stretching làm mỗi lần băm tốn thêm thời gian và tài nguyên. Đó là chi phí nhỏ cho một lần đăng nhập, nhưng là chi phí rất lớn với kẻ tấn công thử hàng tỷ lần. Các thuật toán tiêu biểu: bcrypt, PBKDF2, scrypt, Argon2.

Vì vậy với mật khẩu, người ta dùng các thuật toán băm chuyên dụng và chậm có sẵn salt, chứ không dùng SHA-256 trần.

✍️ Chữ ký số

Vì sao chỉ có hash là chưa đủ? Hash cho bạn biết dữ liệu có bị sửa không, nhưng với điều kiện bạn tin được giá trị hash dùng để so sánh. Hàm băm là thuật toán công khai, không có khóa bí mật, nên bất kỳ ai cũng tính được hash của bất kỳ dữ liệu nào. Nếu kẻ tấn công sửa file rồi tính lại hash mới và thay luôn hash công bố bên cạnh, hai giá trị vẫn khớp nhau, dù file đã là file giả.

Ở chuyện của chị Lan, hash của file cập nhật nằm trên trang chính thức của nhà cung cấp, nên so sánh mới có giá trị. Nhưng nếu chị tải cả file lẫn hash từ cùng một trang giả, kẻ tạo trang đã đặt sẵn hash khớp với file giả. Hash chỉ phát hiện được sửa đổi trong quá trình truyền hoặc lưu, khi bạn có một bản hash đáng tin để đối chiếu. Nó không chứng minh ai là người tạo ra file.

Có ba cách làm cho giá trị hash đáng tin:

CáchÝ tưởngHạn chế
Lấy hash qua kênh khác, đáng tin Hash lấy từ trang chính thức, gọi điện xác nhận, hoặc từ nguồn kiểm chứng độc lập Phụ thuộc vào việc kênh đó không bị giả mạo, và phải làm thủ công
HMAC Băm dữ liệu kèm một khóa bí mật dùng chung. Không có khóa thì không tạo được hash hợp lệ Hai bên phải có chung khóa bí mật (lại gặp bài toán chuyển khóa ở Bài 9)
Chữ ký số Ký hash bằng khóa riêng. Không có khóa riêng thì không tạo được chữ ký hợp lệ cho nội dung mới Cần chứng minh khóa công khai thật sự thuộc về người ký (Bài 11)

Chữ ký số (digital signature) là cách thường dùng nhất: nó kết hợp hash với mã hóa bất đối xứng ở Bài 9. Kẻ tấn công vẫn sửa được file và tính được hash mới, nhưng không thể ký hash mới đó vì không có khóa riêng của người gửi. Khi người nhận kiểm tra bằng khóa công khai, chữ ký cũ sẽ không khớp với hash mới, và chữ ký giả sẽ không qua được kiểm tra.

✍️ Hình 10b. Sáu bước từ lúc ký đến lúc kiểm tra. Các bước lần lượt được nhấn mạnh.

Quy trình:

  1. Người gửi băm tài liệu để có hash.
  2. Người gửi ký hash bằng khóa riêng của mình, kết quả là chữ ký số.
  3. Gửi tài liệu kèm chữ ký.
  4. Người nhận băm lại tài liệu nhận được, ra hash H1.
  5. Người nhận dùng khóa công khai của người gửi để giải chữ ký, ra hash H2.
  6. So sánh H1 và H2. Khớp thì chữ ký hợp lệ.

Chiều dùng khóa ngược với mã hóa bí mật ở Bài 9: ký bằng khóa riêng, kiểm tra bằng khóa công khai.

Chữ ký số mang lạiVì sao
Toàn vẹn Sửa dù một ký tự thì H1 lệch H2
Xác thực Chỉ người giữ khóa riêng mới tạo được chữ ký đó
Không thể chối bỏ (non-repudiation) Người ký khó chối đã ký, vì chỉ họ có khóa riêng

Chữ ký số không mã hóa nội dung. Tài liệu vẫn đọc được bởi bất kỳ ai nhận được. Nếu cần giữ bí mật thì phải mã hóa thêm.

🧠 Áp vào câu chuyện của Nam

Tình huốngKhái niệm
Hai mã SHA-256 của file cập nhật không khớp Hash kiểm tra toàn vẹn, phát hiện sửa đổi
Ba nhân viên có cùng hash MD5 Thiếu salt, và MD5 đã lỗi thời
Đổi sang bcrypt hoặc Argon2 với salt riêng Salting và key stretching
Nhà cung cấp ký bản cập nhật bằng khóa riêng, phần mềm kiểm tra bằng khóa công khai Chữ ký số
Nhà cung cấp không thể chối đã phát hành bản đã ký Non-repudiation

📖 Thuật ngữ cần nhớ

Thuật ngữNghĩa
Hash, digest Giá trị băm, đầu ra cố định của hàm băm.
Collision Va chạm, hai dữ liệu khác nhau cho cùng hash.
Salt Chuỗi ngẫu nhiên riêng cho mỗi mật khẩu, trộn vào trước khi băm.
Rainbow table Bảng hash dựng sẵn dùng để tra ngược mật khẩu.
Key stretching Làm chậm việc băm bằng nhiều vòng lặp để chống đoán vét cạn.
bcrypt, PBKDF2, scrypt, Argon2 Thuật toán băm mật khẩu có key stretching.
Digital signature Chữ ký số, ký hash bằng khóa riêng.
Integrity Tính toàn vẹn, dữ liệu không bị sửa.
Non-repudiation Không thể chối bỏ.
HMAC Hash kèm khóa bí mật, kiểm tra cả toàn vẹn lẫn nguồn gốc giữa hai bên có chung khóa.

📌 Tóm tắt nhanh

  • Hash là một chiều, độ dài cố định, xác định. Hash không phải mã hóa.
  • MD5 và SHA-1 đã lỗi thời, dùng SHA-256 trở lên.
  • Mật khẩu lưu bằng hash có salt (mỗi người một chuỗi) và key stretching (làm chậm), dùng bcrypt, PBKDF2, scrypt hoặc Argon2.
  • Chữ ký số: băm tài liệu, ký hash bằng khóa riêng, kiểm tra bằng khóa công khai. Cho toàn vẹn, xác thực, không thể chối bỏ.

💬 Hỏi & Đáp nhanh

❓ Salt có cần giữ bí mật không? Không. Salt thường được lưu ngay cạnh hash. Mục đích của salt là làm mỗi hash duy nhất và vô hiệu hóa bảng tính sẵn, chứ không phải che giấu.

❓ Hash có thể bị "giải ngược" không? Về nguyên tắc là không. Nhưng kẻ tấn công vẫn có thể đoán mật khẩu rồi băm thử cho đến khi trùng. Vì vậy mật khẩu yếu vẫn bị lộ, và vì thế mới cần salt và key stretching để việc đoán tốn kém.

❓ Chữ ký số khác chữ ký tay quét thành ảnh thế nào? Chữ ký tay quét chỉ là hình ảnh, ai cũng sao chép được và không gắn với nội dung. Chữ ký số gắn với chính nội dung tài liệu qua hash: sửa nội dung thì chữ ký mất hiệu lực. Và nó chỉ tạo được bằng khóa riêng của người ký.

📝 Bài tập đánh giá

Tự chọn đáp án cho từng câu, rồi đối chiếu với phần đáp án ở cuối bài.

Câu 1. Nhà cung cấp phần mềm công bố mã SHA-256 của file cài đặt. Người dùng tính lại mã sau khi tải để làm gì?

  • A. Giải mã nội dung file
  • B. Kiểm tra file có bị sửa đổi hay không
  • C. Tăng tốc độ tải
  • D. Ký xác nhận file

Câu 2. Hai người dùng chọn cùng một mật khẩu, và hệ thống lưu ra hai hash khác nhau. Yếu tố nào giúp đạt được điều này?

  • A. Key stretching
  • B. Salt
  • C. Chữ ký số
  • D. Chứng chỉ số

Câu 3. Quản trị viên muốn cho việc đoán vét cạn hash mật khẩu tốn kém hơn nhiều bằng cách cố tình làm chậm mỗi lần băm. Kỹ thuật nào được dùng?

  • A. Salting
  • B. Key stretching
  • C. Obfuscation
  • D. Tokenization

Câu 4. Điều nào đúng về thuật toán MD5?

  • A. Là chuẩn mật mã đối xứng hiện đại
  • B. Đã bị phá về va chạm, không nên dùng cho mục đích bảo mật
  • C. Có thể giải ngược ra dữ liệu gốc
  • D. Là thuật toán trao đổi khóa

Câu 5. Một tài liệu được ký số. Người nhận dùng gì để kiểm tra chữ ký?

  • A. Khóa riêng của người nhận
  • B. Khóa công khai của người ký
  • C. Khóa riêng của người ký
  • D. Khóa phiên đối xứng

👉 Đáp án

Câu 1: B — So hash của file vừa tải với hash công bố để phát hiện file bị sửa đổi hoặc tải nhầm file giả.

Câu 2: B — Salt là chuỗi ngẫu nhiên riêng cho mỗi mật khẩu, làm hai mật khẩu giống nhau cho hai hash khác nhau.

Câu 3: B — Key stretching làm chậm việc băm bằng nhiều vòng lặp, khiến đoán vét cạn tốn kém.

Câu 4: B — MD5 đã bị phá về va chạm nên không còn phù hợp cho mục đích bảo mật.

Câu 5: B — Ký bằng khóa riêng của người ký, kiểm tra bằng khóa công khai của người ký.


📚 Bài viết thuộc khóa học CompTIA Security+ của VNExperts

🧭 Điều hướng

⬅️ Bài trước🏠 Mục lục khóa họcBài kế tiếp ➡️
Bài 9: Mật mã nền tảng: mã hóa đối xứng, bất đối xứng, trao đổi khóa Mục lục khóa học CompTIA Security+ Bài 11: PKI và chứng chỉ số: CA, CSR, CRL/OCSP, TLS