由於我認為載具驗證碼還是屬於類似密碼的文本,比較機敏一點,因此我還是希望可以在資料庫去加密。然而這不能像一般帳號登入的密碼做不可逆的加密,因為後續要使用載具驗證碼去撈取載具發票,因此必須要做可逆。
而我選用 pycryptodome 這個套件,並透過 AES 進行加密
pip install pycryptodome
加密
from Crypto.Cipher import AES
import base64
import hashlib
import os
secret = os.getenv("SECRET_KEY")
def encrypt_with_salt(data):
salt = hashlib.sha256(secret.encode()).digest()
key = hashlib.pbkdf2_hmac('sha256', secret.encode(), salt, 100000)
cipher = AES.new(key, AES.MODE_GCM)
ciphertext, tag = cipher.encrypt_and_digest(data.encode())
return base64.b64encode(salt + cipher.nonce + tag + ciphertext).decode('utf-8')
解密
import base64
import hashlib
import os
secret_key = os.getenv("SECRET_KEY")
def decrypt_with_salt(encrypted_data):
encrypted_data = base64.b64decode(encrypted_data)
salt = encrypted_data[:32]
nonce = encrypted_data[32:32+16]
tag = encrypted_data[32+16:32+32]
ciphertext = encrypted_data[32+32:]
key = hashlib.pbkdf2_hmac('sha256', secret_key.encode(), salt, 100000)
cipher = AES.new(key, AES.MODE_GCM, nonce=nonce)
try:
decrypted_data = cipher.decrypt_and_verify(ciphertext, tag)
return decrypted_data.decode('utf-8')
except Exception as e:
logging.info(e)
raise e