使用 SQLAlchemy 进行数据加密

2023-04-05 00:00:00 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
皮蛋编程

从输出结果中可以看出,数据成功被加密并存储到了数据库中,而解密后的数据也能够正确输出。

相关文章