RevealTheme logo

Bộ tạo Hash (MD5 / SHA)

Tạo các hàm băm mật mã: MD5, SHA-1, SHA-256, SHA-384 và SHA-512. Chạy trong trình duyệt của bạn thông qua Web Crypto API.

Hàm băm mật mã là gì và khi nào bạn cần chúng?

Hàm băm mật mã là một thuật toán tất định biến bất kỳ đầu vào nào (vài byte, một tệp nhiều gigabyte hay toàn bộ Wikipedia tiếng Anh) thành một đầu ra có kích thước cố định gọi là 'bản tóm lược' (digest) hay 'mã băm' (hash). SHA-256 tạo ra 256 bit (64 ký tự thập lục phân); SHA-512 tạo ra 512 bit; MD5 tạo ra 128 bit. Bốn đặc tính định nghĩa một hàm băm 'mật mã', khác với loại không mật mã (như CRC32): tính tất định (cùng đầu vào → cùng mã băm, luôn luôn), hiệu ứng thác đổ (thay đổi một bit duy nhất làm thay đổi khoảng một nửa số bit đầu ra), khả năng kháng tiền ảnh (bạn không thể đảo ngược mã băm để khôi phục đầu vào) và khả năng kháng va chạm (bạn không thể tìm ra hai đầu vào tạo ra cùng một mã băm). Khi một hàm băm bị phá vỡ, thường hai đặc tính cuối này sụp đổ: các cuộc tấn công va chạm nhắm vào MD5 (2004) và SHA-1 (2017) đã khiến chúng không còn phù hợp cho mục đích bảo mật, mặc dù chúng vẫn dùng được cho các kiểm tra tính toàn vẹn không có đối thủ, như tổng kiểm tra của tệp. Hãy dùng SHA-256 hoặc SHA-512 cho mọi công việc bảo mật mới. Công cụ này dùng Web Crypto API của trình duyệt (crypto.subtle.digest), được tăng tốc bằng phần cứng trên các thiết bị hiện đại, và tạo ra đầu ra giống hệt từng byte với OpenSSL, mô-đun hashlib của Python và mô-đun crypto của Node.

Các trường hợp sử dụng phổ biến

  • Xác minh một tệp đã tải xuống khớp với SHA-256 mà nhà phát hành liệt kê (ISO Linux, các bản phát hành công cụ bảo mật).

  • Tạo một định danh dựa trên nội dung cho khóa bộ nhớ đệm (hash của nội dung → URL ổn định).

  • Tạo khóa khử trùng lặp để lưu trữ tệp (hash khớp = tệp giống hệt nhau).

  • Xây dựng xác minh chữ ký webhook — HMAC-SHA256 của payload với secret dùng chung.

  • Tạo hash nội dung kiểu Git (SHA-1 cho định danh tree/blob).

  • Xác thực tính toàn vẹn của một hàng cơ sở dữ liệu bằng cách hash các cột khóa và lưu hash đó.

Câu hỏi thường gặp

Tại sao MD5 đã lỗi thời đối với bảo mật?
Các nhà mật mã học đã tìm ra cách dựng nên hai đầu vào khác nhau tạo ra cùng một MD5. Một khi các va chạm có thể tìm ra được, MD5 không còn là một tín hiệu toàn vẹn đáng tin cậy trong các kịch bản có đối thủ (ai đó có thể tráo một tệp và tạo ra một tệp khác có cùng mã băm). Đối với các tổng kiểm tra không có đối thủ (tệp đã tải xuống đúng cách chưa?), MD5 vẫn hoạt động tốt; nó chỉ không an toàn cho chữ ký số hoặc bất cứ thứ gì chịu ảnh hưởng của kẻ tấn công.
Có thể đảo ngược các mã băm không?
Không trực tiếp: các hàm băm mật mã là hàm một chiều. Nhưng: (1) đối với các đầu vào ngắn hoặc có entropy thấp (mật khẩu, các cụm từ thông dụng), kẻ tấn công có thể tính trước mã băm của mọi đầu vào khả dĩ (bảng cầu vồng) và tra cứu mã của bạn. Đó là lý do việc băm mật khẩu dùng các giá trị muối ngẫu nhiên duy nhất. (2) Đối với các đầu vào có độ dài tùy ý và entropy cao (khóa ngẫu nhiên, nội dung tệp), việc đảo ngược là bất khả thi về mặt tính toán.
Sự khác biệt giữa SHA-256 và HMAC-SHA256 là gì?
SHA-256 là một mã băm đơn giản: bất kỳ ai có đầu vào đều có thể tính ra cùng một mã băm. HMAC-SHA256 là một mã băm có khóa: bạn cần một bí mật chia sẻ để tính nó. Các webhook dùng HMAC vì bên xác minh muốn biết 'thứ này có do ai đó biết bí mật tạo ra không?', chứ không chỉ 'payload có khớp với một giá trị đã biết không?'. Hãy dùng Bộ tạo HMAC của chúng tôi cho biến thể có khóa.
Khi nào tôi nên dùng SHA-512 thay vì SHA-256?
SHA-512 có nhiều bit đầu ra hơn (512 so với 256), khiến các cuộc tấn công va chạm về mặt lý thuyết khó hơn. Nhưng SHA-256 đã an toàn vượt xa bất kỳ khung thời gian hợp lý nào (sức mạnh hiệu dụng chống va chạm là 2^128). SHA-512 đôi khi nhanh hơn trên phần cứng 64 bit nhờ các phép toán nội bộ rộng hơn. Hãy dùng SHA-256 theo mặc định; dùng SHA-512 nếu bạn có một lý do cụ thể.
Tại sao mã băm SHA của tôi khác với mã của một công cụ khác?
Ba nguyên nhân khả dĩ: (1) Mã hóa đầu vào khác nhau: các byte được đem băm phải khớp. UTF-8, UTF-16 hoặc Latin-1 tạo ra các mã băm khác nhau cho cùng một văn bản nhìn thấy được. Công cụ này mã hóa đầu vào dưới dạng UTF-8. (2) Ký tự xuống dòng ở cuối: một số công cụ thêm một ký tự xuống dòng, số khác thì không. (3) BOM (dấu thứ tự byte): một tiền tố ẩn ba byte mà một số trình soạn thảo thêm vào các tệp UTF-8.
Dùng nó với dữ liệu nhạy cảm có an toàn không?
Có: việc tính mã băm diễn ra cục bộ trong trình duyệt của bạn thông qua Web Crypto. Đầu vào không bao giờ rời khỏi thiết bị của bạn. Bản thân các mã băm không 'nhạy cảm' theo nghĩa chúng không tiết lộ đầu vào (với giả định có đủ entropy), nhưng nếu bạn tính mã băm của dữ liệu có entropy thấp (như mật khẩu không có muối), hãy lưu ý rằng bất kỳ ai thấy mã băm đều có thể đảo ngược nó thông qua các bảng cầu vồng.

Công cụ liên quan