(91) 350-9520 support@omarine.org M-F: 7 AM - 7 PM; Weekends: 9 AM - 5 PM

Hàm băm mật mã (Cryptographic hash function)

Với cùng thông điệp “The quick brown fox jumps over the lazy dog“, các hàm băm mật mã khác nhau cho ra mã băm với kết quả như sau


bash-4.2$ echo -n "The quick brown fox jumps over the lazy dog" | md5sum | cut -d' ' -f1

9e107d9d372bb6826bd81d3542a419d6

bash-4.2$ echo -n "The quick brown fox jumps over the lazy dog" | sha1sum | cut -d' ' -f1

2fd4e1c67a2d28fced849ee1bb76e7391b93eb12

bash-4.2$ echo -n "The quick brown fox jumps over the lazy dog" | sha256sum | cut -d' ' -f1

d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592

bash-4.2$ echo -n "The quick brown fox jumps over the lazy dog" | sha512sum | cut -d' ' -f1

07e547d9586f6a73f73fbac0435ed76951218fb7d0c8d788a309d785436bbb642e93a252a954f23912547d1e8
a3b5ed6e1bfd7097821233fa0538f3db854fee6

bash-4.2$ echo -n "The quick brown fox jumps over the lazy dog" | shasum -a 512224 | cut -d' ' -f1

944cd2847fb54558d4775db0485a50003111c8e5daa63fe722c6aa37

Chỉ tới khi đụng vào hàm băm mật mã, thuật ngữ “băm” mới cho thấy ý nghĩa đầy đủ. Một ứng dụng của hàm băm mật mã là băm mật khẩu, lưu trữ mã băm sẽ an toàn hơn lưu trữ nguyên mật khẩu gốc dạng văn bản rõ (cleartext). Mã băm phải đảm bảo, từ mã băm rất khó để tìm ra được mật khẩu gốc. Muốn vậy thì hàm băm mật mã phải thực hiện băm thật kỹ, băm đi băm lại dữ liệu theo cách thức sao cho mã băm đầu ra, hiểu đơn giản là không còn dấu vết của dữ liệu đầu vào. Thực tế mật khẩu còn thường được cho thêm muối trước khi băm.

Để dữ liệu đầu vào có thể được cắt ra thành những khúc có kích thước nhất định trước khi băm, thuật toán băm thực hiện nhồi thêm các bits vào dữ liệu gốc, giống như chúng ta độn thêm bột hay phụ gia vào thực phẩm vậy. Ví dụ đối với hàm băm sử dụng khúc dữ liệu cỡ 512 bits, dữ liệu đầu vào(thông điệp) được gắn thêm bit 1, sau đó không thêm hoặc thêm một số bit 0 sao cho tổng chiều dài dữ liệu chia cho 512 dư 448. Cuối cùng thêm 64 bits biểu diễn chiều dài thông điệp. Chiều dài tổng thể của dữ liệu như thế là bội của 512 và dữ liệu bao gồm các khúc 512 bits.

Quá trình băm thực hiện trên từng khúc dữ liệu, mỗi khúc được băm một số vòng(số vòng lặp đang sử dụng hiện nay là 64 vòng hoặc 80 vòng). Thuật toán duy trì các biến tương ứng với các từ của mã băm, mỗi từ 32 bits hoặc 64 bits, và mỗi vòng thực hiện tính toán các biến trên cơ sở khúc dữ liệu và các thao tác khác. Khúc dữ liệu, tùy theo loại hàm băm có thể được sơ chế hoặc không, được chia thành các mảnh nhỏ cỡ 32 bits hoặc 64 bits và được “trộn” dần vào các vòng băm. Trong mỗi vòng băm, “gia vị” được bổ sung là hằng số, đối với đa số hàm băm hằng số được lấy từ một hay hai mảng cho trước, trong đó có mảng các giá trị của một hàm phi tuyến hoặc mảng của các số nguyên tố đầu tiên. Dữ liệu được “băm” sử dụng kết hợp các phép toán trên bit. Cuối một vòng, thuật toán thực hiện “nháo” dữ liệu bằng cách gán một số biến đầu ra bằng với một số biến đầu vào nhưng hoán vị. Các biến với giá trị mới lại trở thành biến đầu vào cho vòng tiếp theo. Chúng ta thấy rằng dữ liệu được băm là dữ liệu hỗn hợp, nhưng mô tả rõ hơn thì, thuật toán thực hiện băm các biến trong khi thả mảnh dữ liệu và gia vị vào, rồi nháo các biến, tính toán, khởi tạo các biến cho vòng sau, rồi lại băm tiếp. Khi kết thúc tất cả các vòng băm của một khúc, khúc dữ liệu coi như được nén vào các biến.

Việc tính toán được bắt đầu với một giá trị hash khởi tạo, coi như mã băm hiện hành của khúc dữ liệu đầu tiên. Ở đầu chu kỳ của một khúc, các biến được gán với các từ tương ứng của mã băm hiện hành. Sau khi đi qua hết các vòng băm, các biến kết quả được cộng tương ứng vào các từ của mã băm hiện hành để tạo ra mã băm mới. Quá trình băm thực hiện băm đi băm lại trên từng khúc dữ liệu, mã băm mới của chu kỳ này được dùng làm mã băm hiện hành của chu kỳ tiếp theo, cho tới khúc cuối cùng. Giá trị nối các từ của mã băm sau cùng là mã kết quả của hàm băm.

Hàm băm mật mã ứng dụng nhiều trong an ninh thông tin, điển hình là kiểm tra tính toàn vẹn của dữ liệu, mã hóa mật khẩu, xác minh tệp tin, chứng thực thông điệp, chữ ký kỹ thuật số, và các dạng ứng dụng hệ quả khác mà chứa hàm băm mật mã bên trong. Hàm băm mật mã còn được sử dụng như hàm băm thường, phục vụ cho bảng băm như chúng ta đã biết. Vì mã băm của một đối tượng là duy nhất, nó có thể được dùng như dấu vân tay để nhận dạng đối tượng. Ví dụ để chỉ ra một người sử dụng, cách tốt nhất là sử dụng dấu vân tay là mã băm mật mã dành cho người đó, trong khi mã nhận dạng kiểu khác có thể không rõ ràng và bị trùng lặp.

Hàm băm mật mã phải có khả năng chống cự các loại tấn công mật mã, tối thiểu phải đảm bảo có 3 tính chất sau:

  • Kháng tiền ảnh (Pre-image resistance)
    Với một mã băm h bất kỳ, khó tìm được một thông điệp m nào mà h=hash(m). Điều này làm chúng ta liên tưởng tới tính một chiều của hàm số. Trong góc độ hàm số toán học, mã băm là ảnh còn thông điệp là tạo ảnh của mã băm, hay gọi là tiền ảnh. Sức kháng cự tấn công từ ảnh ngược về tiền ảnh gọi là kháng tiền ảnh. Một hàm băm có kháng tiền ảnh yếu là lỗ hổng cho các cuộc tấn công tiền ảnh.
  • Kháng tiền ảnh thứ hai (Second pre-image resistance)
    Với một thông điệp m1 bất kỳ, khó tìm được một thông điệp thứ hai m2 sao cho m1 ≠ m2hash(m1) = hash(m2). Xác suất xảy ra biến cố có thông điệp m2 như thế tương tự biến cố “Cùng ngày sinh như bạn”. Một hàm băm có kháng tiền ảnh thứ hai yếu là lỗ hổng cho các cuộc tấn công tiền ảnh thứ hai.
  • Kháng xung đột (Collision resistance)
    Khó tìm được một cặp thông điệp m1m2 sao cho m1 ≠ m2hash(m1) = hash(m2). Cặp như thế được gọi là xung đột băm mật mã. Tính chất này đôi khi còn được gọi là kháng xung đột mạnh. Nó yêu cầu chiều dài băm ít nhất phải dài hơn hai lần so với yêu cầu của kháng tiền ảnh, nếu không xung đột có thể xảy ra bởi một cuộc tấn công Ngày sinh.

MD5 (Message-Digest algorithm 5)

Thuật toán MD5 là thuật toán băm mật mã tiêu hóa thông điệp (message-digest). Bởi vì thuật toán băm mật mã được diễn tả như quá trình chế biến thực phẩm nên gọi MD5 là thuật toán tiêu hóa thông điệp cũng là tự nhiên. Mã băm mật mã còn có tên gọi riêng là digest. Hàm băm MD5 có chiều dài băm 128 bits, tương đương 32 chữ số hexadecimal. Lệnh md5sum trình bày trên phần đầu của bài đã hiển thị giá trị digest, tôi viết lại xuống đây cho rõ


bash-4.2$ echo -n "The quick brown fox jumps over the lazy dog" | md5sum | cut -d' ' -f1

9e107d9d372bb6826bd81d3542a419d6

Hàm băm MD5 từng được sử dụng rộng rãi trong mật mã, nhưng đã bị phá vỡ kháng xung đột năm 2004 và bị tấn công tiền ảnh lý thuyết năm 2009. Trong chức năng kiểm tra tính toàn vẹn của tệp tin được tải về, MD5 chỉ còn được sử dụng ở khía cạnh kiểm tra lỗi download, xem tệp tin đã được tải về đầy đủ hay bị hỏng. Nhưng sử dụng mã MD5 để xác minh tệp tin là không an toàn. Một quá trình mật mã sử dụng toàn bộ MD5 là không an toàn. Trong trang hướng dẫn của lệnh md5sum xuất bản tháng này (tháng 12/2014) có nội dung về lỗi MD5, nguyên văn như sau:

BUGS
The MD5 algorithm should not be used any more for security related purposes. Instead, better use an SHA-2 algorithm, implemented in the programs sha224sum(1), sha256sum(1), sha384sum(1), sha512sum(1)”

Dịch sang tiếng Việt:

CÁC LỖI
Không nên sử dụng thuật toán MD5 cho mục đích an ninh nào nữa. Thay vào đó, tốt hơn là sử dụng họ thuật toán SHA-2 được thi hành trong các chương trình sha224sum, sha256sum, sha384sum, sha512sum”

SHA-2 (Secure Hash Algorithm- 2)

SHA (Secure Hash Algorithm) là thuật toán băm bảo mật. SHA-1 được nhận dạng là có các khiếm khuyết an ninh và được đề xuất là không đủ an toàn để tiếp tục sử dụng vào năm 2005.


bash-4.2$ echo -n "The quick brown fox jumps over the lazy dog" | sha1sum | cut -d' ' -f1

2fd4e1c67a2d28fced849ee1bb76e7391b93eb12

Hàm băm SHA-1 có chiều dài băm 160 bits, tương đương 40 chữ số hexadecimal.

SHA-2 là một họ bao gồm 6 hàm băm với các digests dài 224, 256, 384 hoặc 512 bits: SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256.


bash-4.2$ echo -n "The quick brown fox jumps over the lazy dog" | sha256sum | cut -d' ' -f1

d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592

SHA-256 được tính toán với các từ 32 bits, 64 vòng lặp, còn SHA-512 được tính toán với các từ 64 bits, 80 vòng lặp. SHA-224 với digest dài 224 bits, là phiên bản rút gọn của SHA-256. SHA-384 với digest dài 384 bits, là phiên bản rút gọn của SHA-512. SHA-512/224 và SHA-512/256 đều là các phiên bản rút gọn của SHA-512 với các digests dài tương ứng là 224 bits và 256 bits. Có thông tin về một hàm băm mới là SHA-3 nhưng còn ở dạng dự thảo. Họ SHA-2 được coi là an toàn để sử dụng hiện nay.


bash-4.2$ echo -n "The quick brown fox jumps over the lazy dog" | sha512sum | cut -d' ' -f1

07e547d9586f6a73f73fbac0435ed76951218fb7d0c8d788a309d785436bbb642e93a252a954f23912547d1e8

a3b5ed6e1bfd7097821233fa0538f3db854fee6

bash-4.2$ echo -n "The quick brown fox jumps over the lazy dog" | shasum -a 512224 | cut -d' ' -f1

944cd2847fb54558d4775db0485a50003111c8e5daa63fe722c6aa37
Advertisements

Gửi phản hồi

Website này sử dụng Akismet để hạn chế spam. Tìm hiểu bình luận của bạn được duyệt như thế nào.

%d bloggers like this: