SHA-256 là gì? Cách hoạt động, MD5 vs SHA-256 và checksum

SHA-256 là một hàm băm mật mã biến bất kỳ dữ liệu đầu vào nào, từ một chữ cái đến một tệp nặng nhiều gigabyte, thành một giá trị cố định dài 256 bit, thường được viết dưới dạng 64 ký tự thập lục phân. Nó thuộc họ SHA-2, được NIST công bố trong tiêu chuẩn FIPS 180-2 năm 2002. Cùng một đầu vào luôn cho cùng một mã băm, và không thể khôi phục đầu vào từ mã băm.

Dùng thử miễn phí: Văn bản băm trực tuyến Miễn phí, không cần tài khoản.

Vậy SHA-256 là gì trong thực tế và dùng để làm gì? Chủ yếu là để chứng minh dữ liệu chưa bị thay đổi: checksum của tệp tải về, chứng chỉ TLS, Git, Bitcoin và các yêu cầu API có chữ ký đều dựa vào nó. Bài viết này giải thích SHA-256 hoạt động ra sao, so sánh MD5 vs SHA-256, checksum là gì và cách kiểm tra checksum SHA-256 trên Windows, macOS và Linux. Mọi mã băm dưới đây đều được tính bằng mã lệnh và kiểm tra hai lần. Để tự thử các ví dụ, hãy dán chúng vào trình tạo mã băm miễn phí.

SHA-256 là gì?

SHA là viết tắt của Secure Hash Algorithm (thuật toán băm an toàn). SHA-2 do NSA thiết kế và được NIST chuẩn hóa, lần đầu trong FIPS 180-2 (2002) và hiện nay trong FIPS 180-4. Họ này có nhiều thành viên, được đặt tên theo độ dài đầu ra: SHA-224, SHA-256, SHA-384 và SHA-512, cùng với SHA-512/224 và SHA-512/256. SHA-256 là thành viên được dùng rộng rãi nhất.

Mã băm hoạt động giống như dấu vân tay của dữ liệu. Đây là ví dụ mã băm SHA-256 cho từ "hello" và cho đầu vào rỗng:

SHA-256("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
SHA-256("")      = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Hai kết quả có độ dài bằng nhau, vì đầu ra luôn là 256 bit. Tức là 32 byte, và vì mỗi chữ số thập lục phân chứa 4 bit nên cần 256 ÷ 4 = 64 ký tự hex.

SHA-256 hoạt động thế nào, tóm tắt

  1. Đệm. Thông điệp được thêm một bit 1, sau đó là các bit 0, và cuối cùng là độ dài ban đầu dưới dạng số 64 bit, sao cho tổng độ dài là bội số của 512 bit.
  2. Khối. Thông điệp sau khi đệm được chia thành các khối 512 bit.
  3. Nén. Mỗi khối đi qua 64 vòng thao tác đơn giản trên các từ 32 bit: xoay bit, XOR, AND và phép cộng modulo 2³². Các vòng này trộn khối vào một trạng thái nội bộ gồm tám từ 32 bit (8 × 32 = 256 bit).
  4. Đầu ra. Sau khối cuối cùng, trạng thái chính là mã băm.

Mỗi khối thay đổi trạng thái mà khối tiếp theo bắt đầu, nên thay đổi ở bất kỳ vị trí nào trong đầu vào đều ảnh hưởng đến kết quả.

Các đặc tính quan trọng của SHA-256

Hiệu ứng tuyết lở rất dễ thấy. "hello" và "Hello" khác nhau một chữ cái, và hai chữ h (01101000) và H (01001000) chỉ khác nhau đúng một bit:

SHA-256("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
SHA-256("Hello") = 185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969

Hai mã băm khác nhau ở 125 trong số 256 bit, gần với một nửa như kỳ vọng ở đầu ra ngẫu nhiên, và khác ở 61 trong số 64 ký tự hex.

Một giới hạn: kháng tiền ảnh bảo vệ dữ liệu khó đoán, chứ không bảo vệ các chuỗi ngắn dễ đoán. Mã băm của "hello" có trong mọi bảng tra cứu trực tuyến, vì ai cũng có thể băm các từ phổ biến và lưu lại kết quả.

Checksum là gì?

Checksum (tổng kiểm tra) là một giá trị ngắn được tính từ dữ liệu để sau này bạn biết dữ liệu có bị thay đổi hay không. Các checksum đơn giản như CRC32, dùng trong tệp ZIP và gói tin mạng, phát hiện được lỗi vô tình như tải về bị hỏng hay ổ đĩa lỗi, nhưng rất dễ bị làm giả có chủ đích.

Dùng SHA-256 làm checksum còn bảo vệ trước việc cố ý sửa đổi, vì không ai có thể tạo ra một tệp đã sửa mà vẫn khớp với giá trị gốc. Có một điều kiện: mã băm mong đợi phải đến từ nguồn bạn tin cậy, như trang HTTPS chính thức của dự án hoặc tệp checksum có chữ ký. Kẻ tấn công kiểm soát được trang tải về có thể thay cả tệp lẫn mã băm được công bố.

SHA-256 được dùng ở đâu

MD5 vs SHA-256 (và SHA-1, SHA-512)

Thuật toán Đầu ra Số ký tự hex Công bố Mức độ an toàn
MD5 128 bit 32 1992 (RFC 1321) Đã bị phá: va chạm thực tế từ năm 2004
SHA-1 160 bit 40 1995 (FIPS 180-1) Đã bị phá: va chạm công khai đầu tiên năm 2017
SHA-256 256 bit 64 2002 (FIPS 180-2) An toàn: chưa có va chạm nào
SHA-512 512 bit 128 2002 (FIPS 180-2) An toàn: chưa có va chạm nào

Cùng một đầu vào qua cả bốn thuật toán:

MD5("hello")     = 5d41402abc4b2a76b9719d911017c592
SHA-1("hello")   = aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
SHA-256("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
SHA-512("hello") = 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043

MD5 là gì? MD5 là hàm băm 128 bit cũ hơn, ra đời năm 1992. Năm 2004, nhóm nghiên cứu do Vương Tiểu Vân (Xiaoyun Wang) dẫn đầu đã chỉ ra cách tạo hai đầu vào khác nhau có cùng mã băm MD5, và các công trình sau đó giúp tính những va chạm này rất nhanh. Không được dùng MD5 ở nơi ai đó có thể cố tình tạo ra một tệp trùng mã băm.

SHA-1 trụ được lâu hơn. Tháng 2 năm 2017, CWI Amsterdam và Google công bố SHAttered: hai tệp PDF khác nhau có cùng mã băm SHA-1. NIST khuyến nghị thay thế hoàn toàn SHA-1 trước ngày 31 tháng 12 năm 2030.

SHA-256 chưa có cuộc tấn công thực tế nào được biết đến. Tìm va chạm bằng vét cạn sẽ cần khoảng 2¹²⁸ lần thử, vượt xa khả năng của mọi máy tính hiện có.

Vì vậy, khi chọn giữa MD5 vs SHA-256, hãy dùng SHA-256 cho mọi việc liên quan đến bảo mật. MD5 vẫn dùng được khi không ai cố lừa bạn, chẳng hạn để phát hiện hỏng dữ liệu vô tình hoặc tìm tệp trùng lặp trên ổ đĩa của chính bạn.

SHA-256 và SHA-512 đều an toàn; SHA-256 là lựa chọn mặc định được hỗ trợ rộng rãi hơn. SHA-3 (FIPS 202, 2015) là một thiết kế riêng, được chuẩn hóa như một phương án thay thế chứ không phải vì SHA-2 đã bị phá.

Băm không phải là mã hóa

Mã hóa, như AES, có thể đảo ngược: có đúng khóa là lấy lại được dữ liệu gốc. Mã băm không có khóa và không có đường quay lại; nó luôn dài 256 bit dù đầu vào lớn đến đâu, nên dữ liệu gốc không nằm trong đầu ra. Những trang web tự nhận "giải mã SHA-256" thực ra chỉ tra cứu mã băm của các từ và mật khẩu phổ biến đã được tính sẵn.

Vì sao SHA-256 thuần không phù hợp cho mật khẩu

SHA-256 được thiết kế để chạy nhanh, và đó chính là vấn đề với mật khẩu. Nếu một cơ sở dữ liệu chứa mã băm SHA-256 của mật khẩu bị lộ, kẻ tấn công có thể thử hàng tỷ lần đoán mỗi giây trên card đồ họa. Không có salt, hai người dùng có cùng mật khẩu cũng sẽ có cùng mã băm.

Mật khẩu cần một hàm băm chậm và có salt: Argon2id, scrypt hoặc bcrypt (hoặc PBKDF2 với số vòng lặp lớn). Chúng khiến mỗi lần đoán trở nên tốn kém. Để hiểu rõ về salt và điều gì xảy ra khi mật khẩu đã băm bị lộ, hãy đọc điều gì xảy ra khi mật khẩu được băm.

Cách kiểm tra checksum SHA-256

  1. Sao chép giá trị SHA-256 mong đợi từ trang tải về chính thức hoặc tệp checksum.
  2. Tính mã băm của tệp bạn đã tải về.
  3. So sánh đủ cả 64 ký tự, không chỉ vài ký tự đầu. Chữ hoa hay chữ thường không quan trọng trong hệ hex.

Nếu hai giá trị khác nhau, hãy xóa tệp và tải lại từ nguồn chính thức.

Windows

Trong Command Prompt:

certutil -hashfile ubuntu.iso SHA256

Luôn thêm SHA256: nếu thiếu, certutil sẽ dùng SHA-1. Trong PowerShell, Get-FileHash mặc định dùng SHA-256 và có thể so sánh giúp bạn:

Get-FileHash .\ubuntu.iso
(Get-FileHash .\ubuntu.iso).Hash -eq "paste-the-expected-hash-here"

Dòng thứ hai in ra True hoặc False; -eq không phân biệt chữ hoa chữ thường, nên kết quả viết hoa vẫn khớp với checksum viết thường.

macOS

shasum -a 256 ubuntu.iso
shasum -a 256 -c ubuntu.iso.sha256

Dòng đầu in ra mã băm. Dòng thứ hai kiểm tra nó với tệp checksum, gồm mã băm, hai dấu cách và tên tệp.

Linux

sha256sum ubuntu.iso
sha256sum -c SHA256SUMS --ignore-missing

Với -c, sha256sum đọc tệp checksum và in ra ubuntu.iso: OK hoặc FAILED. --ignore-missing bỏ qua các mục của những tệp bạn chưa tải về.

Một cái bẫy thường gặp khi băm văn bản trên dòng lệnh: echo "hello" | sha256sum cho ra 5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03, không phải giá trị 2cf24d… ở trên, vì echo thêm ký tự xuống dòng. Hãy dùng printf 'hello' | sha256sum để băm đúng năm byte.

Trên trình duyệt

Trình tạo mã băm MD5 và SHA-256 tính MD5, SHA1, SHA224, SHA256, SHA384, SHA512, Keccak-256 và RIPEMD160 cùng lúc, ở chế độ Văn bản hoặc Tệp.

Hai giới hạn: toàn bộ tệp được nạp vào bộ nhớ trước, nên với tệp ISO nhiều gigabyte, các công cụ dòng lệnh ở trên là lựa chọn tốt hơn. Ngoài ra, hàng có nhãn SHA3 là Keccak-512 với cách đệm nguyên bản, khác với NIST SHA3-512.

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

Có thể giải mã hay đảo ngược SHA-256 không?

Không. SHA-256 là hàm một chiều và không có khóa. Các "công cụ giải mã SHA-256" chỉ tìm được những đầu vào đã có sẵn trong bảng tra cứu của chúng; cách này hiệu quả với từ phổ biến và mật khẩu yếu, nhưng không với dữ liệu ngẫu nhiên.

SHA-256 có còn an toàn không?

Có. Chưa có cuộc tấn công va chạm hay tiền ảnh thực tế nào được biết đến đối với SHA-256, và NIST vẫn phê duyệt nó. Ngay cả một máy tính lượng tử lớn chạy thuật toán Grover, theo hiểu biết hiện nay, cũng chỉ giảm công sức tìm tiền ảnh từ khoảng 2²⁵⁶ xuống khoảng 2¹²⁸ phép tính.

Vì sao mã băm SHA-256 dài 64 ký tự?

Mã băm dài 256 bit. Khi viết ở hệ thập lục phân, mỗi ký tự biểu diễn 4 bit, nên 256 ÷ 4 = 64 ký tự. Cùng giá trị đó là 32 byte, hoặc 44 ký tự ở dạng Base64.

SHA-2 và SHA-256 khác nhau thế nào?

SHA-2 là họ hàm băm được định nghĩa trong FIPS 180-4. SHA-256 là một thành viên của họ này, cùng với SHA-224, SHA-384 và SHA-512. Khi phần mềm ghi "SHA-2" mà không kèm độ dài, thường là nói đến SHA-256.

Hai tệp có thể có cùng mã băm SHA-256 không?

Về lý thuyết là có, vì có vô số tệp khả dĩ nhưng chỉ có 2²⁵⁶ mã băm. Trên thực tế, chưa ai từng tìm được hai đầu vào khác nhau có cùng mã băm SHA-256, nên mã băm trùng nhau được xem là bằng chứng hai tệp giống hệt nhau.

Dùng thử miễn phí: Văn bản băm trực tuyến Miễn phí, không cần tài khoản.