EncryptedString.py 1.2 KB

12345678910111213141516171819202122232425262728293031323334
  1. from sqlalchemy import create_engine, Column, Integer, String, TypeDecorator
  2. from sqlalchemy.ext.declarative import declarative_base
  3. from sqlalchemy.orm import sessionmaker
  4. from cryptography.fernet import Fernet
  5. import base64
  6. # 生成加密密钥 (实际应用中应该安全地存储和管理这个密钥)
  7. key = Fernet.generate_key()
  8. cipher_suite = Fernet(key)
  9. Base = declarative_base()
  10. class EncryptedString(TypeDecorator):
  11. """自动加密/解密的字符串类型"""
  12. impl = String # 底层数据库类型
  13. def process_bind_param(self, value, dialect):
  14. """在写入数据库前加密数据"""
  15. if value is not None:
  16. # 如果是字符串则编码为bytes
  17. if isinstance(value, str):
  18. value = value.encode()
  19. # 加密并返回base64编码的字符串(便于存储)
  20. return base64.b64encode(cipher_suite.encrypt(value)).decode('utf-8')
  21. return value
  22. def process_result_value(self, value, dialect):
  23. """从数据库读取后解密数据"""
  24. if value is not None:
  25. # 解密base64编码的字符串
  26. return cipher_suite.decrypt(base64.b64decode(value)).decode('utf-8')
  27. return value