I. Định Nghĩa Hàm Băm
Trong bối cảnh mật mã học, hàm băm được định nghĩa là một phép toán thiết lập mối quan hệ giữa một thông điệp đầu vào (gồm chuỗi ký tự có độ dài tùy ý) và một bản mã đầu ra là một chuỗi ký tự có độ dài cố định. Điều này giúp cho việc xử lý dữ liệu trở nên đơn giản và đồng nhất hơn.
Cụ thể, ký hiệu H() là hàm băm, với thông điệp M thu được bản mã C:
C = H(M)
Các thuật toán băm cần đảm bảo tính chất một chiều, có nghĩa rằng không thể phục hồi thông điệp gốc M từ bản mã C. Nói cách khác, không tồn tại hàm giải mã D() sao cho:
M = D(C)
II. Xung Đột và Kháng Xung Đột
Xung đột băm xảy ra khi có hai đầu vào khác nhau x và y, nhưng chúng lại cho ra kết quả giống nhau khi trải qua hàm băm: H(x) = H(y). Một hàm băm an toàn cần đảm bảo tính kháng xung đột, tức là cần không cho phép tồn tại một cặp khác nhau x ≠ y sao cho H(x) = H(y). Mặc dù lý thuyết cho thấy khó có hàm băm hoàn hảo, việc giảm thiểu xác suất xảy ra xung đột là điểm quan trọng trong việc đảm bảo tính an toàn cho thuật toán băm.
III. Đặc Điểm Của Hàm Băm
Một hàm băm H() cần có các đặc điểm sau:
- H() có thể áp dụng cho khối dữ liệu với độ dài tuỳ ý.
- Kết quả đầu ra từ H() luôn có độ dài cố định.
- Việc thực hiện hàm băm phải dễ dàng và thuận tiện cho việc cài đặt.
- Hàm băm phải là hàm một chiều.
- H() có tính bền xung đột yếu (weak collision resistance): không thể tìm y ≠ x sao cho H(y) = H(x).
- H() có tính bền xung đột mạnh (strong collision resistance): không thể tìm một cặp (x, y) sao cho H(x) = H(y).
IV. Một Số Hàm Băm Thông Dụng
1. MD5
MD5 (Message-Digest Algorithm 5) là một hàm băm được thiết kế bởi Ronald Rivest vào năm 1991. MD5 tạo ra bản mã dài 128 bit, thường được biểu diễn bằng 32 ký tự thập lục phân. Thuật toán này chia thông điệp đầu vào thành các khối 512 bit và xử lý qua nhiều vòng tròn, mỗi vòng thực hiện nhiều tác vụ giống nhau.
MD5 hiện đã không còn an toàn do sự xuất hiện của các phương thức tấn công khác nhau. Dưới đây là cách cài đặt hàm băm MD5 trong Python:
python
import hashlib
data = b'viblo security'
md5_hash = hashlib.md5(data)
print(md5_hash.hexdigest())
Một thử thách cho độc giả: Hãy tìm giá trị data
sao cho md5_hash.hexdigest()
bắt đầu bằng tiền tố 0e.
2. SHA256
SHA-2 (Secure Hash Algorithm 2) được phát triển bởi NSA và phát hành năm 2001. SHA256 có đầu ra dài 256 bit, biểu diễn bằng 64 ký tự thập lục phân. Thuật toán này vẫn được xem là an toàn và tin cậy. Cách cài đặt cũng tương tự như MD5:
python
import hashlib
data = b'viblo security'
sha256_hash = hashlib.sha256(data)
print(sha256_hash.hexdigest())
V. Ứng Dụng Của Hàm Băm
Hàm băm trong mật mã được ứng dụng rộng rãi trong các lĩnh vực sau:
1. Đảm Bảo Tính Toàn Vẹn
Hàm băm giúp đảm bảo tính toàn vẹn của thông điệp. Ví dụ, Alice gửi thông điệp cho Bob và Bob sử dụng cùng thuật toán băm để kiểm tra tính nguyên vẹn của thông điệp mà không cần đảm bảo tính bí mật.
2. Đảm Bảo Tính Bí Mật Cho Dữ Liệu Lưu Trữ
Trong một hệ thống lưu trữ tài khoản người dùng, để đảm bảo an toàn, thay vì lưu trữ mật khẩu bản rõ, server lưu trữ giá trị băm của mật khẩu. Khi người dùng nhập mật khẩu, server sẽ so sánh giá trị băm để xác thực.
3. Ứng Dụng Khác
Hàm băm cũng rất hữu ích trong việc giúp quản lý dữ liệu và tạo chỉ mục, đồng thời đóng vai trò quan trọng trong công nghệ blockchain để đảm bảo tính toàn vẹn dữ liệu và thực hiện chữ ký số cho xác minh giao dịch.
VI. Luyện Tập
Mặc dù hàm băm cho thấy tính một chiều và không thể quay ngược, nhưng công nghệ tấn công như brute force attack vẫn tồn tại. Kẻ tấn công có thể tầm soát các bản rõ và giá trị băm trong cơ sở dữ liệu để tìm bản rõ tương ứng. Sau đây là một số chuỗi băm, hãy sử dụng các dịch vụ online để tìm ra bản rõ của chúng nhé:
e10adc3949ba59abbe56e057f20f883e
6c9b8b27dea1ddb845f96aa2567c6754
5f4dcc3b5aa765d61d8327deb882cf99
25f9e794323b453885f5181f1b624d0b
Tài Liệu Tham Khảo
- Wikipedia - Cryptographic Hash Function
- Wikipedia - MD5
- GeeksforGeeks - MD5 Hash in Python
- Wikipedia - SHA-2
- HackerNoon - A Guide to Hashing
source: viblo