MD5 là gì? Công cụ mã hóa MD5 online
Bài viết được sự cho phép của tác giả Phạm Bình
Bạn có từng thấy qua biểu tượng MD5 khi tải file hay phần mềm trên máy tính? MD5 được sử dụng khá phổ biến nhưng không chắc nhiều bạn đã biết MD5 là gì. Cùng TopDev tìm hiểu về MD5 thật chi tiết thông qua bài viết dưới đây nhé!
Công nghệ mã hóa MD5 là gì?
MD5 (Message Digest Algorithm 5) là một thuật toán băm mật mã học (hash algorithms) được phát triển bởi Ronald Rivest vào năm 1991. MD5 được sử dụng để tạo ra một giá trị băm (hash value) cố định từ một thông điệp hoặc một đoạn dữ liệu đầu vào. Giá trị băm này thường được gọi là “message digest” và có độ dài 128 bit (16 byte), thường được biểu diễn dưới dạng một chuỗi 32 ký tự hex.
Sau khi mã hóa, MD5 luôn cho ra kết quả là một chuỗi có độ dài cố định 32 ký tự cho dù đầu vào là gì đi nữa, và kết quả này không thể dịch ngược (không thể giải mã) lại được.
<?php
// Ví dụ sử dụng mã hóa md5 trong lập trình PHP
$string1 = "Hello world";
echo md5($string1); // f690e937880ebd98086689b871744a84
$string2 = "Xin chao cac ban nha";
echo md5($string2); // f514d5e5d14553003120806ddadffafe
Trên lý thuyết, mỗi đầu vào của thuật toán mã hóa md5 sẽ tương ứng với một đầu ra duy nhất. Nhưng thực tế, người ta cũng đã tìm ra một vài lỗ hổng cho thấy rằng mặc dù đầu vào là 2 mẫu khác nhau, nhưng sau khi mã hóa lại cho ra kết quả giống nhau. Tuy nhiên, sự “đụng độ” về đầu ra của thuật toán mã hóa md5 chỉ xảy ra ở một số trường hợp đặc biệt, và nó không đủ để làm người ta thôi sử dụng thuật toán mã hóa này, ngoài ra bạn cũng có thể thêm “muối” để giảm khả năng xảy ra đụng độ (chi tiết sẽ trình bày ở mục 3).
Cụm từ “đụng độ kết quả” ám chỉ với các đầu vào khác nhau nhưng lại cho ra các kết quả giống nhau.
Mã hóa MD5 thường dùng để làm gì?
Về cơ bản, MD5 là một hàm băm, vì vậy các ứng dụng của nó thường là để:
Mã hóa mật khẩu
Do có tính chất không thể dịch ngược, nên MD5 được sử dụng phổ biến để mã hóa mật khẩu.
Kiểm tra tính toàn vẹn của dữ liệu
Bạn sẽ hiểu hơn khi tham khảo ví dụ sau:
Anh A download một phần mềm X trên internet, nhưng vì một lý do nào đó mà anh A phải download ở một nguồn KHÔNG CHÍNH CHỦ. Anh A lo sợ phần mềm X này đã bị hacker chèn virus. Nhưng may mắn, trên trang chủ của phần mềm X có cung cấp một mã md5 – là kết quả của việc mã hóa toàn bộ phần mềm. Giả sử mã md5 đó là f690e937880ebd98086689b871744a84
.
Để đảm bảo phần mềm X download ở nguồn không chính chủ kia chưa bị chỉnh sửa gì, hay nói cách khác là giống hệt so với việc download từ nguồn chính chủ. Anh A đã mã hóa phần mềm X vừa download bằng thuật toán md5, sau đó so sánh kết quả với mã md5 của nhà phát hành. Nếu 2 mã giống nhau, anh A có thể tin tưởng rằng phần mềm X này chưa bị chỉnh sửa, bởi trên lý thuyết mỗi đầu vào của md5 sẽ chỉ cho ra 1 kết quả duy nhất. Ngược lại, nếu 2 kết quả khác nhau, thì có nghĩa là phần mềm anh A download đã bị chỉnh sửa khác với phiên bản của nhà phát hành.
Trên là một ví dụ điển hình của việc sử dụng md5 để kiểm tra tính toàn vẹn của dữ liệu.
Với nhưng tập dữ liệu lớn hoặc các tệp tin không phải dạng văn bản thuần túy, thì rất khó để nhận biết liệu có sự thay đổi nào giữa 2 phiên bản hay không. Để làm đơn giản việc so sánh này, người ta sẽ dùng một hàm băm (như VD trên là sử dụng md5) để mã hóa các dữ liệu cần so sánh, sau đó nhận biết sự khác nhau dựa vào việc so sánh các kết quả của hàm băm này. Nếu các kết quả giống nhau, đồng nghĩa là các tệp dữ liệu ban đầu cũng giống nhau và ngược lại.
Các thao tác tương tự như trên còn được gọi là checksum.
Tham khảo việc làm JavaScript Developer trên TopDev!
Đặc điểm của thuật toán Message-digest
Các hàm băm, còn được gọi là thuật toán message-digest, là các hàm một chiều; chúng chấp nhận một thông điệp có kích thước bất kỳ làm đầu vào và tạo ra một thông điệp băm có độ dài cố định.
MD5 là thuật toán message-digest thứ ba được tạo ra bởi Ronald Rivest. Các thuật toán MD2, MD4 và MD5 có cấu trúc tương tự nhau, nhưng MD2 được tối ưu hóa cho các máy 8-bit, trong khi hai thuật toán sau được thiết kế cho các máy 32-bit. Thuật toán MD5 là một phần mở rộng của MD4, mặc dù MD4 được đánh giá là nhanh nhưng tiềm ẩn nguy cơ bảo mật. Ngược lại, MD5 không nhanh bằng MD4 nhưng cung cấp mức độ đảm bảo bảo mật dữ liệu cao hơn nhiều.
MD5 hoạt động như thế nào?
Thuật toán băm message-digest MD5 xử lý dữ liệu dưới dạng các chuỗi 512-bit, được chia nhỏ thành 16 từ, mỗi từ gồm 32 bit. Đầu ra từ MD5 là một giá trị message-digest có độ dài 128-bit.
Việc tính toán giá trị băm MD5 được thực hiện qua các giai đoạn riêng biệt, xử lý từng khối dữ liệu 512-bit cùng với giá trị được tính toán ở giai đoạn trước đó. Giai đoạn đầu tiên bắt đầu với các giá trị message-digest được khởi tạo bằng các giá trị số thập lục phân liên tiếp. Mỗi giai đoạn bao gồm bốn lượt xử lý message-digest, chúng thao tác các giá trị trong khối dữ liệu hiện tại và các giá trị được xử lý từ khối trước đó. Giá trị cuối cùng được tính toán từ khối cuối cùng trở thành giá trị băm MD5 cho khối đó.
Nguyên lý hoạt động chung của MD5
Chuẩn bị dữ liệu đầu vào
- Bổ sung bit (Padding Bits):
- Đầu vào ban đầu được bổ sung thêm một bit
1
và sau đó là một chuỗi các bit0
để độ dài của thông điệp sao cho nó thỏa mãn yêu cầu: độ dài thông điệp sau bổ sung bit chia hết cho 512 (cụ thể là 448 bit + 64 bit cho chiều dài gốc của thông điệp).
- Đầu vào ban đầu được bổ sung thêm một bit
- Bổ sung chiều dài (Padding Length):
- Đoạn dữ liệu gốc được bổ sung thêm một đoạn 64 bit để biểu diễn chiều dài của thông điệp ban đầu (trước khi bổ sung bit) dưới dạng nhị phân, sau đó được thêm vào cuối thông điệp. Bước này đảm bảo rằng chiều dài của thông điệp sau bổ sung chia hết cho 512 bit.
Khởi tạo các biến
MD5 sử dụng bốn bộ đệm 32 bit được khởi tạo với các giá trị hằng số nhất định:
- A = 0x67452301
- B = 0xEFCDAB89
- C = 0x98BADCFE
- D = 0x10325476
Xử lý từng khối
- Chia nhỏ thông điệp:
- Thông điệp đã được bổ sung và chia thành các khối 512 bit.
- Xử lý mỗi khối 512 bit:Mỗi khối 512 bit được xử lý qua bốn vòng lặp, mỗi vòng lặp có 16 bước. Trong mỗi bước, một hàm phi tuyến tính được áp dụng lên ba trong số bốn bộ đệm, bộ đệm còn lại được cộng thêm một giá trị từ thông điệp và một giá trị hằng số. Các hàm phi tuyến tính được sử dụng trong các vòng lặp:
- F (B, C, D) = (B AND C) OR (NOT B AND D)
- G (B, C, D) = (B AND D) OR (C AND NOT D)
- H (B, C, D) = B XOR C XOR D
- I (B, C, D) = C XOR (B OR NOT D)
- Cập nhật bộ đệm:
- Sau mỗi khối 512 bit được xử lý, giá trị của các bộ đệm A, B, C, D được cập nhật. Các giá trị mới này sẽ được sử dụng để xử lý khối tiếp theo.
Tạo giá trị băm cuối cùng
Sau khi tất cả các khối 512 bit được xử lý, bốn bộ đệm A, B, C, D sẽ chứa giá trị băm cuối cùng. Các bộ đệm này được nối lại để tạo ra giá trị băm 128 bit (16 byte).
MD5 có an toàn không?
MD5 (Message Digest Algorithm 5) hiện không còn được coi là an toàn về mặt mật mã học. Mục tiêu của bất kỳ hàm băm mật mã học nào là tạo ra các giá trị băm trông như ngẫu nhiên và đáp ứng hai yêu cầu quan trọng:
- Không thể tạo ra một thông điệp khớp với một giá trị băm cụ thể: Đảm bảo rằng không ai có thể tạo ra một thông điệp cụ thể mà khi băm lại cho ra giá trị băm đã biết trước.
- Không thể tạo ra hai thông điệp khác nhau cho ra cùng một giá trị băm: Đảm bảo rằng không ai có thể tìm ra hai thông điệp khác nhau nhưng lại có cùng giá trị băm (va chạm).
Theo Internet Engineering Task Force (IETF), hàm băm MD5 không còn đáp ứng được các yêu cầu này và do đó không nên được sử dụng cho mục đích xác thực mật mã học.
Các vấn đề bảo mật của MD5
Vào năm 2011, IETF đã công bố RFC 6151, “Cập nhật các xem xét về bảo mật cho thuật toán MD5 và HMAC-MD5,” trong đó trình bày nhiều cuộc tấn công gần đây vào hàm băm MD5. Báo cáo này chỉ ra rằng:
- Có một cuộc tấn công có thể tạo ra va chạm băm trong vòng chưa đầy một phút trên máy tính xách tay tiêu chuẩn.
- Một cuộc tấn công khác có thể tạo ra va chạm chỉ trong 10 giây trên hệ thống Pentium 4 tốc độ 2.6 GHz.
Do những lỗ hổng này, IETF khuyến nghị rằng các thiết kế giao thức mới không nên sử dụng MD5 và cho rằng các cuộc tấn công gần đây vào thuật toán này đã cung cấp đủ lý do để loại bỏ việc sử dụng MD5 trong các ứng dụng yêu cầu khả năng chống va chạm, chẳng hạn như chữ ký số.
Thay vào đó, các thuật toán băm mạnh hơn như SHA-256 hoặc SHA-3 được khuyến khích sử dụng để đảm bảo tính toàn vẹn và bảo mật của dữ liệu.
Sử dụng MD5 với “muối” để tăng độ an toàn
Giảm sự đụng độ
Như đã trình bày, kết quả của thuật toán mã hóa MD5 có thể bị đụng độ. Để giảm thiểu khả năng này, người ta thường kèm theo “muối” ở đầu vào của thuật toán. Bạn có thể xem ví dụ sau để dễ hiểu hơn:
<?php
// Ví dụ mã hóa md5 trong PHP có kèm theo "muối"
// Đây chính là "muối", một string bí mật mà chỉ có bạn mới biết
$salt = "$%&$#@^akdmrKDLDGK115";
// String cần mã hóa
$string = "Hello world";
// Output được mã hóa kèm theo "muối"
$output = md5($string . $salt);
echo $output; // d26e50b575ca5d47808442412410afe6
// Hoặc bạn có thể đóng gói thành hàm để dùng cho tiện
function my_md5($string) {
$salt = "$%&$#@^akdmrKDLDGK115";
return md5($string . $salt);
}
echo my_md5($string); // d26e50b575ca5d47808442412410afe6
Với thủ thuật trên, output sẽ giảm tỉ lệ bị đụng độ (giảm tới múc nào thì mình không rõ).
Giảm khả năng bị “vét cạn”
Việc thêm muối khi mã hóa, ngoài việc làm giảm lỗi đụng độ kết quả, còn làm giảm nguy cơ output của bạn bị “vét cạn” – brute force.
Mặc dù md5 là một hàm mã hóa không thể dịch ngược, nhưng vì dạng mã hóa này được sử dụng quá phổ biến, mà người ta có thể xây dựng nên một bộ từ điển chứa kết quả mã hóa của các bộ đầu vào phổ biến như 123123
, anhyeuem
, iloveyou
,… Dựa vào từ điển này, mà một số mã md5 có thể bị dịch ngược. Bạn có thể dễ dàng tìm được các công cụ “dịch ngược md5” bằng cách tìm kiếm từ khóa “crack md5” trên google.
Tuy nhiên khi bạn mã hóa kèm theo muối, thì cho dù là các chuỗi có vẻ phổ biến như 123456
, abcdef
cũng sẽ trở nên vô cùng phức tạp và khó đoán, và điều quan trọng nhất – tỉ lệ nó nằm trong bộ từ điển crack md5 là rất thấp (trừ khi bạn sử dụng “muối” quá đơn giản).
Một vài lưu ý với thủ thuật này:
- Muối của bạn phải đủ phức tạp.
- Chỉ có bạn mới biết muối là gì.
Qua bài viết trên của TopDev, chắc hẳn bạn đã hiểu MD5 là gì và cách thuật toán hash này hoạt động. Tuy còn nhiều lổ hổng bảo mật, nhưng đây cũng là một thuật toán mã hóa thú vị bạn nên biết, bạn có thể kết hợp với một số cách mà chúng tôi đề xuất để sử dụng MD5 an toàn và hiệu quả hơn.
Bài viết được TopDev cập nhật và chỉnh sửa từ bài gốc tại phambinh.net
Có thể bạn quan tâm:
- Tìm hiểu về xác thực và phân quyền trong ứng dụng
- Lưu ý cho Lock trong Java
- Cách tuần tự hóa dữ liệu trong Java như Protobuf
Xem thêm các việc làm Developer hấp dẫn tại TopDev
- B BenQ RD Series – Dòng Màn Hình Lập Trình 4k+ Đầu Tiên Trên Thế Giới
- F Framework nào tốt nhất cho dự án của bạn? – Checklist chi tiết
- K Kinh nghiệm xử lý responsive table hiệu quả
- S Stackoverflow là gì? Bí kíp tận dụng Stack Overflow hiệu quả
- 7 7 kinh nghiệm hữu ích khi làm việc với GIT trong dự án
- B Bài tập Python từ cơ bản đến nâng cao (có lời giải)
- B Bảo mật API là gì? Một số nguyên tắc và kỹ thuật cần biết
- H Hướng dẫn cài đặt và tự học lập trình Python cơ bản từ A-Z
- C Chinh Phục Phân Tích Dữ Liệu Với Pandas Trong Python: Hướng Dẫn Từng Bước
- D Display CSS là gì? Cách khai báo và sử dụng thuộc tính display trong CSS