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:
- Encode tin nhắn (bytes)
- Khởi tạo class Fernet với key
- 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