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

I. Mã hóa MD5 là gì?

MD5 là viết tắt của Message-Digest algorithm 5 – Giải thuật Tiêu hóa tin 5, là một hàm băm được sử dụng phổ biến với giá trị Hash dài 128-bit. MD5 được thiết kế bởi Giáo sư Ronald Rivest của trường Đại học MIT vào năm 1991.

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 mật khẩu trong Selenium Webdriver

II. 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à để:

2.1 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.

2.2 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!

III. Sử dụng MD5 với “muối” để tăng độ an toàn

3.1 Giảm sự đụng độ

Như đã trình bày ở phần I, 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õ).

3.2 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ư 123123anhyeuemiloveyou,… 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ư 123456abcdef 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ì.

Bài viết gốc được đăng tải tại phambinh.net

Có thể bạn quan tâm:

Xem thêm các việc làm Developer hấp dẫn tại TopDev