Hash function chuyển dữ liệu độ dài tùy ý thành chuỗi độ dài cố định. Khó khôi phục dữ liệu gốc (one-way). Dùng cho: kiểm tra toàn vẹn, chữ ký số, lưu password, fingerprint...
Thuật toán phổ biến
- MD5: 128-bit, đã lỗi thời về bảo mật, chỉ dùng check integrity
- SHA family: SHA-1 (160-bit), SHA-224, SHA-256, SHA-384, SHA-512 - an toàn hơn
Module hashlib
import hashlib
# Xem thuật toán có sẵn
print(hashlib.algorithms_guaranteed)
# {'sha256', 'sha512', 'sha1', 'sha3_256', 'blake2b', 'md5', ...}
SHA-1 (Đã yếu, không khuyến nghị cho bảo mật)
import hashlib
hash_obj = hashlib.sha1(b'Hello, Python!')
print(hash_obj.hexdigest()) # 00d375a3693fde63e9540b91656c6ac5b5341f7c
# Từ input người dùng
mystring = input('Enter string to hash: ')
hash_obj = hashlib.sha1(mystring.encode())
print(hash_obj.hexdigest())
SHA-256 (Khuyến nghị cho hầu hết ứng dụng)
hash_obj = hashlib.sha256(b'Hello, Python!') print(hash_obj.hexdigest()) # 64 ký tự hex (256-bit)
SHA-512 (Bảo mật cao hơn, chậm hơn)
hash_obj = hashlib.sha512(b'Hello, Python!') print(hash_obj.hexdigest()) # 128 ký tự hex (512-bit)
Các phương thức hữu ích
| update(data) | Cập nhật dữ liệu (gọi nhiều lần) |
| digest() | Bytes digest (binary) |
| hexdigest() | Hex string (dễ lưu trữ/hiển thị) |
| copy() | Sao chép hash object |
Ví dụ: Hash file lớn (streaming)
def hash_file(filepath, algorithm='sha256'):
hash_obj = hashlib.new(algorithm)
with open(filepath, 'rb') as f:
for chunk in iter(lambda: f.read(4096), b''):
hash_obj.update(chunk)
return hash_obj.hexdigest()
print(hash_file('large_video.mp4'))
Lưu ý bảo mật
- SHA-1 đã bị tấn công collision thực tế (2017) → không dùng cho chữ ký số, cert
- Lưu password: Dùng
bcrypt,scrypt,PBKDF2hoặcargon2(có salt, slow hash) - Kiểm tra file: SHA-256 đủ an toàn