NỘI DUNG
Như tôi đã giới thiệu trong Phần 1: CIA có gì hot?, giải pháp phổ biến nhất để đảm bảo Integrity là Hashing với 2 đặc tính quan trọng cần nhấn mạnh:
– Cùng 1 dữ liệu đầu vào và một Algorithm, kết quả Hash/Checksum sẽ luôn giống nhau;
– Hash là one-way function, kiểu như con heo đã bị xay ra thành xúc xích thì không có phương án nào để biến xúc xích trở lại thành con heo;
Trong kỳ này tôi sẽ đi sâu vào các Hashing Algorithm phổ biến bao gồm Message Digest 5 (MD5), Secure Hash Algorithm (SHA), Hash-based Message Authentication Code (HMAC), RACE Integrity Primitives Evaluation Message Digest (RIPEMD) cũng các trường hợp ứng dụng phổ biến của hash.
#1 Kính thưa các thể loại Hashing Algorithm
Nếu bạn không có nhiều thời gian để đọc thì có thể xem tóm lược thông tin như sau (phần chi tiết hơn tôi nói ngay ở các mục sau).
Algorithm | Mục tiêu | Kết quả |
MD5 | Integrity | Hash 128 bit |
SHA-1 | Integrity | Hash 160 bit |
SHA-2 | Integrity | Hash 224, 256, 384 và 512 bit |
SHA-3 | Integrity | Hash 224, 256, 384 và 512 bit |
HMAC-MD5 | Integrity – Authenticity | Hash 128 bit |
HMAC-SHA1 | Integrity – Authenticity | Hash 160 bit |
#1.1 MD5
Message Digest 5 (MD5) cho ra kết quả hash 128 bit, thường thể hiện dạng Hexadecimal (sử dụng số từ 0 đến 9 và chữ từ a đến f). Hàng này thì cổ lắm rồi, và giang hồ cũng đã ghi nhận có lổ hổng nghiêm trọng từ năm 2004 (hiện gần như đã có thể bị crack hoàn toàn) nên nếu dùng để xử lý password hiển nhiên không phải là ý tưởng sáng suốt cho lắm (tuy nhiên vẫn còn có thể dùng tạm để kiểm tra Integrity cho file, email).
#1.2 SHA
Secure Hash Algorithm (SHA) có thể được phân thành 4 nhóm:
– SHA-0: không được sử dụng;
– SHA-1: cho kết quả hash 160 bit, nói chung cũng được khuyến nghị không nên xài vì cũng đã bắt đầu xuất hiện vấn đề từ năm 2005 và đề nghị dẹp năm 2011 (tuy nhiên vẫn còn có thể dùng tạm để kiểm tra Integrity cho file, email như MD5). Bạn có thể đọc kỹ hơn ở trang https://shattered.io và thông tin minh họa Collision Attack bên dưới.
– SHA-2 là phiên bản cải thiện của SHA-1 gồm 4 version:
- SHA-256: cho kết quả hash 256 bit;
- SHA-512: cho kết quả hash 512 bit;
- SHA-224: cho kết quả hash 224 bit, là phiên bản cắt gọt (truncated) của SHA-256;
- SHA-384: cho kết quả hash 384 bit, là phiên bản cắt gọt của SHA-512.
– SHA-3: hay còn gọi là Keccak là phiên bản thay thế cho SHA-2 (NSA sáng tác SHA-1 và SHA-2 nên một số người cũng hơi quan ngại). SHA-3 do đó cũng có thể tạo 4 phiên bản như SHA-2 là SHA-256, SHA-512, SHA-224 và SHA-384.
#1.3 HMAC
Hash-based Message Authentication Code (HMAC) cũng sử dụng Hashing Algorithm như MD5 và SHA-1 để tạo kết quả hash với tên gọi tương ứng là HMAC-MD5 và HMAC-SHA1 . Tuy nhiên nó sẽ sử dụng thêm shared secret key để tăng độ ngẫu nhiên trong kết quả và chỉ có người gửi và người nhận biết được shared secret key.
Vì lí do này, HMAC ngoài cung cấp Integrity nó còn cung cấp thêm Authenticity – nghĩ là có thể xác định người gửi và người nhận. Bạn sẽ có dịp gặp lại thằng HMAC này khi đụng Internet Protocol Security (IPSec), Transport Layer Security (TLS) hay như phần cấu hình VPN với OpenVPN như tôi giới thiệu trong Hướng dẫn tạo VPN Server miễn phí từ A đến Z – Phần 4: Tạo Private Key và ký Certificate cho VPN Server, VPN Client và cấu hình OpenVPN Server.
#1.4 RIPEMD
RACE Integrity Primitives Evaluation Message Digest (RIPEMD) không phổ biến như MD5, SHA hay HMAC nhưng cũng có thể được sử dụng để bảo đảm Integrity với các phiên bản cho kết quả hash 128 bit, 160 bit, 256 bit và 320 bit.
#2 Các trường hợp ứng dụng phổ biến của Hash
Việc sử dụng các Hashing Algorithm khá đa dạng tuy nhiên tôi nghĩ có 3 món quan trọng sau cần được đề cập.
#2.1 Kiểm tra file Integrity
Để xử lý thủ công, bạn có thể tìm và download các công cụ tính hash. Tôi lấy ví dụ như cái Microsoft File Checksum Integrity Verifier.
Việc sử dụng khá đơn giản như hướng dẫn trong file ReadMe.txt (bạn extract file download ra sẽ thấy file thực thi fciv.exe và file hướng dẫn ReadMe.txt).
Với trường hợp minh họa đơn giản cả 2 algorithm MD5 và SHA-1 với file ReadMe.txt bạn sẽ thấy kết quả tương tự như sau.
Trường hợp sử dụng phổ biến như tôi trình bày trong Phần 1: CIA có gì hot?, bạn sẽ tính hash của một file cụ thể sau đó so sánh với hash đã được công bố để xác định tính Integrity của file.
Lưu ý: Phần so sánh cũng có thể thực hiện qua công cụ (bạn xem kỹ cú pháp tương ứng của từng công cụ) chứ đừng ngồi đó soi bằng mắt nhé.
#2.2 Xử lý password
Việc hash password cũng sẽ cho kết quả giống như hash file tuy nhiên mục tiêu sử dụng có thể hơi khác:
– Hash file nhằm bảo đảm Integrity của file;
– Hash password thường được dùng để bảo vệ password trong tình huống bị tấn công rò rỉ database (tuy nhiên thỉnh thoảng cũng có vài đại ca bị dính phốt lưu plaintext password vào databases).
Cụ thể, khi người dụng tạo/cập nhật password, hệ thống sẽ sử dụng Hashing Algorithm để tính ra hash trước khi lưu vào database. Ở những lần đăng nhập xác thực về sau, hệ thống sẽ so sánh kết quả hash của thông tin password người dùng cung cấp và phần hash lưu trữ trong database.
Đến đây nếu bạn dõng dạc tuyên bố “Pass anh đã hash rồi, mời các chú vào xơi thử!” thì coi chừng ăn hành. Thực tế các password hash vẫn có thể “trọng thương” trước các đối thủ nặng ký như Dictionary hay Brute-force và đặc biệt là Rainbow Table Attack.
Trong tình huống này, bạn sẽ cần thêm mắm dặm muối vào password (đúng nghĩa đen luôn vì quá trình này được gọi là chính thống là Salting Password) trước khi hash. Yêu cầu quan trọng hàng đầu là Salt (đôi khi còn có thể thêm cả Pepper sau Salt) phải có tính chất của một chuỗi ngẫu nhiên thì mới có thể gây khó khăn cho các đại ca đang ngày đêm ủ mưu crack password của bạn.
Lưu ý:
– Dictionary, Brute-force và Rainbow Table Attack nằm trong nhóm các kỹ thuật tấn công password phổ biến. Đây là một chủ đề hay (và cũng nhức đầu bỏ mịa) nên để tôi giới thiệu riêng trong một diễn biến khác;
– Rainbow Table Attack đặc biệt nguy hiểm đối với password hash nằm trong các database đã bị lấy về để phân tích offline vì lúc này cơ chế lockout khi đăng nhập sai password sẽ không còn tác dụng;
– Việc Hashing hay Salting Password trước khi hash và lưu vào database thực tế có thể được xử lý thông qua các module tích hợp của các ngôn ngữ lập trình chứ không ai làm thủ công kiểu như tôi demo minh họa đâu nhé.
#2.3 Xử lý email/ tin nhắn
Một ứng dụng phổ biến khác của Hashing Algorithm là trao đổi email/ tin nhắn. Với trường hợp này người gửi và người nhận có thể gửi kết quả hash kèm nội dung thông tin cho người nhận. Bên phía người nhận, ứng dụng (email/ tin nhắn) sẽ tính toán lại kết quả hash của nội dung thông tin và so sánh với kết quả hash đi kèm để bảo đảm Integrity cho nội dung.
Tuy nhiên, cái nói trên là phương án lý tưởng vì nếu có một ông thần ngồi giữa (Man in the Midle) thì việc thay đổi nội dung thông tin và hash đi kèm gần như không có gì khó. Đó là lí do vì sao mà HMAC có đất dụng võ.
Với HMAC, ngoài Hashing Algorithm sẽ còn có thêm một cái share secret key chỉ có người gửi và người nhận biết được. Như vậy lúc này cái hash đính kèm sẽ là HMAC nên nếu không có share secret key thì trên lý thuyết sẽ không ai khác ngoài người gửi và người nhận có thể xử lý được.
Và như mọi khi, chuyện này lại dẫn tới chuyện kia, cụ thể ở đây vấn đề là “người gửi và người nhận sẽ trao đổi cái share secret key như thế nào thì mới bảo đảm an toàn, kín đáo”. Nội dung này sẽ liên quan đến một vấn đề rất quan trọng trong mã hóa đó là trao đổi khóa mà tôi sẽ bắt đầu giới thiệu trong các kỳ tiếp theo.
4 thoughts on “Giải ngố Cryptography – Phần 2: Đảm bảo Integrity với Hashing Algorithm”