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

Bảo mật dữ liệu với Python: Mã hóa & Giải mã dùng thư viện Cryptography

Hướng dẫn mã hóa và giải mã dữ liệu (ví dụ: chuỗi văn bản) dùng thư viện cryptography trong Python.

Mã hóa (Encryption) là quá trình mã hóa thông tin sao cho chỉ bên được ủy quyền mới truy cập được. Giúp bảo vệ dữ liệu nhạy cảm.

  • Cryptography Basics (Cơ bản mật mã học)

Ví dụ này dùng symmetric encryption (mã hóa đối xứng) - cùng một key dùng cho cả encrypt và decrypt.

Thư viện cryptography xây dựng trên thuật toán AES.

Mã hóa dữ liệu trong Python

Cài đặt thư viện

pip3 install cryptography

Tạo Key (Generate Key)

Import Fernet và tạo key - cần thiết cho symmetric encryption/decryption.

from cryptography.fernet import Fernet

def generate_key():
    """Tạo key và lưu vào file"""
    key = Fernet.generate_key()
    with open("secret.key", "wb") as key_file:
        key_file.write(key)

Chỉ cần chạy method này một lần để tạo key.

Lưu ý: Phải bảo quản key an toàn. Mất key = không thể decrypt dữ liệu đã mã hóa với key đó.

Load Key (Nạp key)

Sau khi tạo key, nạp key vào method để mã hóa:

def load_key():
    """Nạp key 'secret.key' từ thư mục hiện tại"""
    return open("secret.key", "rb").read()

Mã hóa tin nhắn (Encrypt Message)

Quy trình 3 bước:

  1. Encode tin nhắn (bytes)
  2. Khởi tạo class Fernet với key
  3. Gọi encrypt() với tin nhắn đã encode
# 1. Encode message
message = "message I want to encrypt".encode()

# 2. Khởi tạo Fernet
f = Fernet(key)

# 3. Encrypt
encrypted_message = f.encrypt(message)

Full Code Example (Mã hóa hoàn chỉnh)

from cryptography.fernet import Fernet

def generate_key():
    key = Fernet.generate_key()
    with open("secret.key", "wb") as key_file:
        key_file.write(key)

def load_key():
    return open("secret.key", "rb").read()

def encrypt_message(message):
    key = load_key()
    encoded_message = message.encode()
    f = Fernet(key)
    encrypted_message = f.encrypt(encoded_message)
    print(encrypted_message)

if __name__ == "__main__":
    encrypt_message("encrypt this message")

Kết quả (ví dụ):

b'gAAAAABesCUIAcM8M-_Ik_-I1-JD0AzLZU8A8-AJITYCp9Mc33JaHMnYmRedtwC8LLcYk9zpTqYSaDaqFUgfz-tcHZ2TQjAgKKnIWJ2ae9GDoea6tw8XeJ4='

Giải mã dữ liệu trong Python (Decrypt)

Gọi decrypt() từ Fernet. Cũng cần nạp key vì key cần thiết cho decrypt.

from cryptography.fernet import Fernet

def load_key():
    return open("secret.key", "rb").read()

def decrypt_message(encrypted_message):
    key = load_key()
    f = Fernet(key)
    decrypted_message = f.decrypt(encrypted_message)
    print(decrypted_message.decode())

if __name__ == "__main__":
    decrypt_message(b'gAAAAABesCUIAcM8M-_Ik_-I1-JD0AzLZU8A8-AJITYCp9Mc33JaHMnYmRedtwC8LLcYk9zpTqYSaDaqFUgfz-tcHZ2TQjAgKKnIWJ2ae9GDoea6tw8XeJ4=')

Kết quả:

encrypt this message