Hàm băm trong mật mã học - Hashing in cryptography
I. Định nghĩa
Dựa theo bối cảnh mật mã học, chúng ta có thể định nghĩa hàm băm là một phép toán đưa thông điệp đầu vào (chuỗi ký tự, độ dài tùy ý) xử lý và trả về kết quả là một xâu ký tự có độ dài cố định. Từ đó có thể thực hiện quá trình xử lý dữ liệu dễ dàng hơn do các khối dữ liệu trở nên thống nhất và cấu tạo và độ dài.
Ký hiệu là hàm băm, với thông điệp , chúng ta thu được bản mã :
Các thuật toán hash phải đảm bảo tính chất chỉ có một chiều. Tức là chúng ta không thể "tính toán" ra thông điệp bản rõ khi biết bản mã. Nói cách khác, không tồn tại hàm giải mã sao cho:
II. Xung đột và kháng xung đột
Khi tồn tại hai đầu vào và khác nhau và xảy ra: thì chúng ta gọi hiện tượng này là xung đột băm (hash collision). Một hàm băm an toàn thì cần đảm bảo tính kháng xung đột, nghĩa là không thể tồn tại sao cho . Đây cũng chính là điều kiện hoàn hảo mà các nhà nghiên cứu mật mã học mong mỏi đạt được, mặc dù trên lý thuyết thì hầu như không thể tồn tại một hàm băm thỏa mãn điều kiện này, tuy nhiên việc giảm xác suất xảy ra sự xung đột xuống càng thấp cũng đồng nghĩa với thuật toán băm càng an toàn.
III. Đặc điểm của hàm băm
Nhìn chung, một hàm băm cần có các đặc điểm sau:
- có thể áp dụng với khối dữ liệu bất kỳ có độ dài bất kỳ.
- Kết quả trả về của (đầu ra) cần có độ dài cố định, dù dữ liệu đầu vào có độ dài lớn hay nhỏ.
- Thuật toán thực thi phải được tính toán dễ dàng, tạo điều kiện thuận lợi cho việc cài đặt hàm băm.
- phải là hàm một chiều, tức không thể tìm ra thông điệp gốc khi có giá trị chuỗi kết quả hash.
- mang tính bền xung đột yếu (weak collision resistance): với bất kỳ giá trị , không thể tìm được sao cho .
- mang tính bền xung đột mạnh (strong collision resistance): Không thể tính được một cặp sao cho .
IV. Một số hàm băm thông dụng
1. MD5
MD5 (Message-Digest algorithm ) được thiết kế bởi Ronald Rivest vào năm - là một hàm băm mật mã học có kích thước đầu ra (output size) dài bit, thường được biểu diễn dưới dạng ký tự ở hệ thập lục phân.
Thuật toán MD5 thực hiện chia thông điệp đầu vào thành từng khối tin có độ dài bit (trước đó thực hiện bổ sung bit sao cho là bội của ). Sau đó xử lý mỗi khối tin qua round, mỗi round thực hiện tác vụ giống nhau (tổng tác vụ). Chúng ta sẽ không trình bày kỹ quá trình băm của thuật toán, bạn đọc có thể tìm hiểu thêm qua một số tài liệu online.
Chúng ta có thể cài đặt hàm băm MD5 dễ dàng trong ngôn ngữ Python3, bằng cách sử dụng thư viện hashlib, cú pháp hashlib.md5()
, dữ liệu input và output đều thể hiện dưới dạng bytes. Tuy nhiên, chúng ta thường hiển thị output của MD5 hash dưới dạng thập lục phân bằng cách sử dụng hexdigest()
import hashlib
data = b'viblo security'
md5_hash = hashlib.md5(data)
print(md5_hash.hexdigest())
Một challenge nhỏ dành cho bạn đọc: Hãy tìm giá trị data
sao cho md5_hash.hexdigest()
bắt đầu bằng tiền tố 0e. Gợi ý: Có thể có nhiều đáp án cho challenge này, sao không thử brute force với các con số nhỉ!
Hiện tại thì hàm băm MD5 không còn an toàn nữa, do nó đã không đảm bảo được tính kháng xung đột.
2. SHA256
SHA-2 (Secure Hash Algorithm ) được tổ chức United States National Security Agency (NSA) đưa ra năm . SHA256 là một dạng thuật toán tiêu chuẩn của nó. SHA256 có kích thước đầu ra (output size) dài bit, thường được biểu diễn dưới dạng ký tự ở hệ thập lục phân.
Hiện tại thì thuật toán SHA256 vẫn được coi là an toàn và có thể tin tưởng được. Chúng ta có thể cài đặt bằng Python3 với thư viện hashlib
, tương tự hàm băm MD5:
import hashlib
data = b'viblo security'
sha256_hash = hashlib.sha256(data)
print(sha256_hash.hexdigest())
V. Ứng dụng
Các hàm băm mật mã học được ứng dụng rộng rãi trong nhiều lĩnh vực.
1. Đảm bảo tính toàn vẹn
Do tính chất kháng xung đột, một khi dữ liệu bị sửa đổi thì giá trị băm cũng thay đổi theo. Ví dụ, Alice gửi một thông điệp cho Bob, để đảm bảo thông điệp đó trước khi được gửi tới Bob không bị can thiệp và thay đổi nội dung bởi bên thứ ba, Bob chỉ cần sử dụng cùng một thuật toán băm với Alice, thực hiện băm thông điệp nhận được, nếu kết quả trùng với kết quả băm do Alice đưa ra, thì đồng nghĩa với việc thông điệp còn nguyên vẹn (chỉ đảm bảo tính toàn vẹn chứ không thể đảm bảo tính bí mật trong trường hợp này, kẻ tấn công có khả năng xem thông điệp và không sửa đổi gì).
2. Đảm bảo tính bí mật cho dữ liệu lưu trữ
Xét ví dụ một website sử dụng cơ sở dữ liệu nhằm lưu trữ tài khoản người dùng (bao gồm tên đăng nhập và mật khẩu). Với nhân sự liên quan tới quản trị hệ thống hoặc một số nhân viên có quyền hạn sẽ có thể truy cập vào cơ sở dữ liệu, xem được thông tin lưu trữ trong đó. Điều này là không an toàn nếu tài khoản và thông tin người dùng được lưu trữ trực tiếp mà không được mã hóa. Mặt khác, nếu sử dụng các thuật toán mã hóa hai chiều thì có vẫn xảy ra nguy cơ bị giải mã ngược lại.
Do đó, một giải pháp được đưa ra là sử dụng hash một chiều cho các dữ liệu nhạy cảm. Ví dụ với mật khẩu người dùng, thay vì lưu trữ bản rõ, server sẽ lưu trữ hash MD5 của mật khẩu vào database. Khi người dùng thực hiện đăng nhập, server chỉ cần so sánh giá trị MD5 của mật khẩu do người dùng cung cấp và giá trị hash được lưu trong database sẽ có thể đưa ra kết luận người dùng nhập đúng mật khẩu hay không. Khi đó dù database có bị lộ thì cũng có thể đảm bảo được dữ liệu người dùng vẫn an toàn do tính một chiều của thuật toán hàm băm.
3. Ứng dụng khác
Ngoài ra, các hàm băm có thể đưa các dữ liệu về cùng một định dạng để dễ quản lý và sử dụng. Việc thực hiện đánh chỉ mục (index) dữ liệu bằng giá trị băm cũng tránh việc xung đột do hai dữ liệu khác nhau không thể trả về cùng một kết quả băm (kháng xung đột).
Hàm băm cũng đóng vai trò quan trọng trong công nghệ blockchain, đảm bảo tính toàn vẹn của dữ liệu, tạo chữ ký số trong các xác minh tính chính xác của giao dịch.
VI. Luyện tập
Như chúng ta đã biết, hàm băm mang tính một chiều và không thể bị "đảo ngược". Tuy nhiên, với sự phát triển của công nghệ lưu trữ cũng như tính toán dữ liệu, một cách tấn công đơn giản đối với hàm băm là thực hiện "vét cạn" - brute force attack. Attacker lưu trữ lượng lớn các bản rõ và giá trị băm tương ứng của chúng trong một cơ sở dữ liệu. Khi họ cần "phá vỡ" một chuỗi hash mật khẩu, chỉ cần tìm kiếm trong database, nếu như xuất hiện thì cũng tương ứng thu được bản rõ của nó, đồng nghĩa với việc mật khẩu của bạn đã bị "crack" thành công. Bởi vậy, đừng sử dụng các mật khẩu "thông dụng"! Sau đây là một số chuỗi hash, bạn hãy sử dụng các website online để tìm ra bản rõ của chúng nhé!
e10adc3949ba59abbe56e057f20f883e
6c9b8b27dea1ddb845f96aa2567c6754
5f4dcc3b5aa765d61d8327deb882cf99
25f9e794323b453885f5181f1b624d0b
Tài liệu tham khảo
All rights reserved