iT邦幫忙

2023 iThome 鐵人賽

DAY 17
0

由於我認為載具驗證碼還是屬於類似密碼的文本,比較機敏一點,因此我還是希望可以在資料庫去加密。然而這不能像一般帳號登入的密碼做不可逆的加密,因為後續要使用載具驗證碼去撈取載具發票,因此必須要做可逆。

而我選用 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

上一篇
Day 16:用 MongoDB 設計 - 載具
下一篇
Day 18:圖片 API
系列文
透過 python 建立發票系統 - 自己的發票自己查30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言