使用 SQLAlchemy 进行数据加密
使用 SQLAlchemy 进行数据加密可以保障数据的安全性,下面是一个简单的代码演示:
首先需要安装 cryptography 库,这是一个加密库,可以使用 pip install cryptography 命令进行安装。
然后在使用 SQLAlchemy 时,需要导入 sqlalchemy.ext.declarative 模块,因为该模块会自动为我们创建一个 MetaData 对象,并且会在创建表时自动加上一列 id。
接下来,通过定义一个加密器和解密器来实现数据的加解密:
from cryptography.fernet import Fernet key = Fernet.generate_key() cipher_suite = Fernet(key) class EncryptionMixin(object): def _get_encrypted(self, value): return cipher_suite.encrypt(value.encode('utf-8')).decode('utf-8') def _get_decrypted(self, value): return cipher_suite.decrypt(value.encode('utf-8')).decode('utf-8')
其中,_get_encrypted 用于进行加密,_get_decrypted 用于进行解密。
最后,将加密器和解密器应用到 SQLAlchemy 的数据模型中:
from sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class User(EncryptionMixin, Base): __tablename__ = 'user' id = Column(Integer, primary_key=True) name = Column(String) email = Column(String) password = Column(String) def __init__(self, name, email, password): self.name = name self.email = self._get_encrypted(email) self.password = self._get_encrypted(password) @property def decrypted_email(self): return self._get_decrypted(self.email) @property def decrypted_password(self): return self._get_decrypted(self.password)
在 User 模型中,使用了 EncryptionMixin 中定义的 _get_encrypted 方法对 email 和 password 字段进行加密;同时,定义了两个属性 decrypted_email 和 decrypted_password,用于获取解密后的值。
最后,通过使用 SQLAlchemy 创建表,并插入一条数据:
engine = create_engine('sqlite:///test.db') session = sessionmaker(bind=engine)() Base.metadata.create_all(engine) user = User('pidancode', 'pidancode.com', '皮蛋编程') session.add(user) session.commit() print(user.name) print(user.decrypted_email) print(user.decrypted_password)
最后,输出结果如下:
pidancode pidancode.com 皮蛋编程
从输出结果中可以看出,数据成功被加密并存储到了数据库中,而解密后的数据也能够正确输出。
相关文章