Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Mã hóa SHA (SHA-1, SHA-256, SHA-512) trong Python

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, PBKDF2 hoặc argon2 (có salt, slow hash)
  • Kiểm tra file: SHA-256 đủ an toàn