Học bằng cách đọc theo thứ tự

hashlib — Tính giá trị hash cho dữ liệu

Học hashlib.sha256 cho hash 64 ký tự, ba thuộc tính tất định / hiệu ứng tuyết lở / một chiều, phát hiện sửa đổi file, và lý do mật khẩu cần bcrypt / argon2 chứ không phải hashlib.

hashlib là module thư viện chuẩn tính một giá trị hash độ dài cố định từ chuỗi byte bất kỳ. Thuật toán chủ lực SHA-256 trả về chuỗi hex 256-bit = 64 ký tự, được dùng rộng rãi ở mọi nơi bạn muốn xác nhận "nội dung có giống nhau không?" — kiểm tra toàn vẹn file, ký API, ID commit Git, v.v.

Khác với picklebase64, hashlib là chuyển đổi một chiều — bạn không thể khôi phục đầu vào từ đầu ra. Hãy nhớ rằng nó không phải để "lưu và khôi phục" mà để "chỉ cho biết hai đầu vào có giống hay khác nhau".

pickle / base64 vs hashlib
pickle / base64chuyển đổi hai chiềuobject ⇄ bytesbytes ⇄ ASCIIlưu và khôi phụchashlibchuyển đổi một chiềubytes → hashkhông đảo ngược đượcđánh giá giống vs kháccông dụngcông dụng
pickle / base64chuyển đổi hai chiều, có thể đảo ngược dùng cho "lưu và khôi phục" và "chuyển đổi cho truyền tải". hashlibchuyển đổi một chiều, không thể đảo ngược cho tình huống chỉ cần đánh giá hai đầu vào có giống hay khác nhau. Phạm vi sử dụng khác về cơ bản — đừng nhầm lẫn.

SHA-256 — Hash hex 64 ký tự với ba thuộc tính

Bốn công dụng điển hình của hashlib
toàn vẹn fileso sánh sha256sumID commit Githash của toàn bộ treesinh cache keyhash đầu vào làm keyký API (HMAC)ngăn sửa đổi request
Xác minh toàn vẹn download / ID commit Git / sinh cache key / ký request API (HMAC). Điểm chung là đánh giá "nội dung có giống không?" qua hash độ dài cố định — không đảo ngược được, nên không thể thay thế lưu trữ.
Ba thuộc tính của hàm hash
đầu vào ASHA-256hash X(64 ký tự hex)đầu vào A (lần nữa)SHA-256hash X(luôn giống nhau)đầu vào A' (lệch 1 ký tự)SHA-256hash Y(hoàn toàn khác)
Tính tất định (cùng đầu vào → cùng đầu ra), hiệu ứng tuyết lở (lệch một bit → đầu ra hoàn toàn khác), và một chiều (không thể khôi phục đầu vào từ đầu ra). SHA-256 luôn xuất ra chuỗi hex 64 ký tự, dùng cho phát hiện sửa đổi và kiểm tra toàn vẹn.
Method / Thuật toánĐộ dài bitCông dụng
hashlib.sha256(b)256 bit (64 ký tự hex)toàn vẹn file / ký API (khuyến nghị)
hashlib.sha512(b)512 bit (128 ký tự hex)khi muốn hash dài hơn
hashlib.md5(b)128 bit (32 ký tự hex)có tấn công xung đột — đừng dùng cho code mới
.hexdigest()lấy hash dưới dạng chuỗi hex
.digest()lấy hash dưới dạng bytes thô

Đừng dùng riêng hashlib để lưu mật khẩu

Nếu bạn lưu mật khẩu user bằng cách chỉ hash chúng bằng sha256 hay tương tự, chúng sẽ dễ bị tấn công tra cứu trước (rainbow table). Bạn có thể chống lại bằng các thư viện chuyên dụng tích hợp sẵn salt + key stretchingbcrypt / argon2 / passlib. hashlib phù hợp cho tình huống "đầu vào có giống không?" như kiểm tra toàn vẹn file và ký API.

Tính SHA-256 của "Hello, Python!" và xác nhận đầu ra luôn là chuỗi hex 64 ký tự.

① Hãy import hashlib và chuyển chuỗi "Hello, Python!" sang bytes bằng UTF-8.

② Hãy lấy SHA-256 của bytes đó dưới dạng chuỗi hex với hashlib.sha256(...).hexdigest().

③ Hãy in độ dài của hash dưới dạng Độ dài SHA-256: ◯ (kết quả là 64).

Python Editor

Chạy code để xem đầu ra

Kiểm chứng tính tất định và hiệu ứng tuyết lở

Trong các đặc điểm của hàm hash, "cùng đầu vào → cùng đầu ra" (tính tất định) và "lệch một ký tự → đầu ra hoàn toàn khác" (hiệu ứng tuyết lở) có thể được xác nhận bằng cách so sánh hai đầu vào hơi khác nhau. Hai thuộc tính này chính là điều khiến hash hữu ích cho kiểm tra toàn vẹn file và phát hiện sửa đổi.

So sánh hash từ Thực hành 1 với một giá trị tính lại và một giá trị có ký tự cuối bị đổi.

① Hãy lặp lại các bước Thực hành 1 để đặt SHA-256 của "Hello, Python!" vào sha.

② Hãy hash cùng đầu vào lần nữa và kiểm tra xem có bằng sha không — in dưới dạng Giống khi tính lại: True / False.

③ Hãy tính hash của bytes với ! đổi thành . ở cuối và xác nhận nó khác sha — in dưới dạng Khác sau 1 ký tự: True / False.

Python Editor

Chạy code để xem đầu ra
QUIZ

Kiểm tra kiến thức

Hãy trả lời từng câu hỏi một.

Câu 1Độ dài của chuỗi trả về từ hexdigest() của SHA-256 là gì?

Câu 2Điều gì xảy ra với SHA-256 của cùng đầu vào?

Câu 3Bạn có thể khôi phục đầu vào gốc từ một hash không?

Câu 4Lựa chọn tốt nhất để lưu mật khẩu user là gì?