0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

Hướng Dẫn Mã Hóa và Giải Mã Dữ Liệu với AES trong Python

Đăng vào 6 tháng trước

• 4 phút đọc

Giới Thiệu

Trong thế giới số hiện đại, việc bảo mật thông tin là vô cùng quan trọng. Chúng ta thường cần giữ bí mật cho các dữ liệu nhạy cảm như mật khẩu, thông tin cá nhân hoặc tin nhắn riêng tư. AES (Advanced Encryption Standard) là một trong những phương pháp mã hóa phổ biến và hiệu quả nhất để thực hiện điều này.

AES là một phương pháp biến đổi dữ liệu từ dạng văn bản bình thường thành dạng không thể đọc được (mã hóa) và sau đó quay trở lại dạng văn bản bình thường (giải mã) sử dụng cùng một khóa bí mật (thuật toán đối xứng). Khi bạn cần bảo vệ thông tin nhạy cảm - chẳng hạn như mật khẩu, dữ liệu tài chính hoặc thông điệp bí mật - việc mã hóa là điều cần thiết.

Cài Đặt

Trước khi bắt đầu:

  • Bạn cần cài đặt Python 3.7 hoặc phiên bản mới hơn.

  • Cài đặt gói Python cryptography bằng cách chạy lệnh sau:

    Copy
    pip install cryptography

Hiểu Về Mã Hóa AES

AES là một thuật toán sử dụng khóa đối xứng, nghĩa là cùng một khóa bí mật được sử dụng cho cả mã hóa và giải mã.

Các kích thước khóa được AES hỗ trợ:

  • 128 bit
  • 192 bit
  • 256 bit (khoá mạnh nhất và được sử dụng trong ví dụ này)

Chế độ hoạt động quyết định cách thức hoạt động của thuật toán bên trong. Một số chế độ phổ biến bao gồm:

  • ECB (Electronic Codebook): Đơn giản nhưng không an toàn.
  • CBC (Cipher Block Chaining): Tốt hơn ECB nhưng cần cẩn thận về tính toàn vẹn.
  • GCM (Galois/Counter Mode): Hiện đại và an toàn. Nó cung cấp cả mã hóa và kiểm tra tích hợp để đảm bảo dữ liệu không bị thay đổi.

Trong mã của chúng ta, chúng ta sẽ sử dụng chế độ GCM.

Ví Dụ Mã Python

Dưới đây là một ví dụ hoàn chỉnh:

python Copy
import random
import string
import base64
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

def encrypt_with_aes(input: str, enc_key: str, iv: str):
    key = enc_key.encode()
    nonce = iv.encode()
    plaintext = input.encode()
    aesgcm = AESGCM(key)
    ciphertext = aesgcm.encrypt(nonce, plaintext, None)

    # Chuyển đổi byte được mã hóa thành chuỗi Base64 có thể đọc được
    ciphertext_str = base64.b64encode(ciphertext).decode()
    return ciphertext_str

def decrypt_with_aes(input: str, enc_key: str, iv: str):
    key = enc_key.encode()
    nonce = iv.encode()
    ciphertext = base64.b64decode(input)
    aesgcm = AESGCM(key)
    decrypted = aesgcm.decrypt(nonce, ciphertext, None)
    return decrypted.decode()

def generate_iv_string(length=16):
    # Tạo một chuỗi ngẫu nhiên cho nonce
    chars = string.ascii_letters + string.digits + "#$()*+,-.:;<=>?@[]_"
    return ''.join(random.choices(chars, k=length))

enc_key = "1Xt5YfM4ZNuFdwp3OfVkwkhhQLagWKtt"  # Khóa bí mật 32 ký tự
iv = generate_iv_string(12)  # tạo một nonce/iv ngẫu nhiên
input = "Đây là một thông điệp bí mật"

ciphertext = encrypt_with_aes(input, enc_key, iv)  # dữ liệu được mã hóa base64
print("Ciphertext:", ciphertext)

decrypted = decrypt_with_aes(ciphertext, enc_key, iv)
print("Decrypted:", decrypted)

Cách Mã Hoạt Động:

  • encrypt_with_aes: Nhận thông điệp và biến nó thành dạng không thể đọc được.
  • decrypt_with_aes: Chuyển đổi thông điệp không thể đọc được trở lại thành văn bản bình thường.
  • generate_iv_string: Tạo nonce ngẫu nhiên mới mỗi lần.

Khi bạn chạy mã, bạn sẽ thấy:

Copy
Ciphertext: I1M8nE7HxHlmv7uKZPM/FsorN4hIiNhAm8fg2TavM75Dxp00zFrgRQem67E=
Decrypted: Đây là một thông điệp bí mật

Mẹo Bảo Mật

  • Giữ khóa an toàn: Đừng viết khóa trực tiếp trong mã nguồn thực tế của bạn. Hãy lưu trữ trong biến môi trường hoặc kho lưu trữ an toàn.
  • Sử dụng nonce khác nhau mỗi lần: Không bao giờ tái sử dụng cùng một nonce với cùng một khóa.
  • Thay đổi khóa theo thời gian: Đối với các dự án dài hạn, hãy thay đổi (xoay vòng) khóa của bạn định kỳ.

Thực Hành Tốt Nhất

  • Luôn sử dụng các thư viện mã hóa đã được kiểm chứng và duy trì.
  • Đảm bảo rằng bạn đã hiểu rõ về các chế độ mã hóa và cách thức hoạt động của chúng trước khi triển khai vào sản xuất.

Các Cạm Bẫy Thường Gặp

  • Không sử dụng chế độ ECB cho các ứng dụng thực tế do mức độ bảo mật kém.
  • Không lưu trữ khóa mã hóa trong mã nguồn.

Kết Luận

AES-GCM là một phương pháp mạnh mẽ và đáng tin cậy để bảo vệ dữ liệu an toàn. Chỉ với một vài dòng mã Python, bạn có thể mã hóa một thông điệp và sau đó lấy lại nó bằng cùng một khóa.

Để tìm hiểu thêm, hãy tham khảo tài liệu của thư viện cryptography.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào