SQLAlchemy 加密列而不在检索时自动解密
SQLAlchemy encrypt a column without automatically decrypting upon retrieval
目前,我使用 sqlalchemy_utils
中的 EncryptedType
,以便在进入 table 的途中自动加密数据,并在从 [=18] 检索数据时解密数据=],使用一些预定义的字符串作为加密密钥。这工作正常,但现在要求已经改变,虽然我仍然需要在进入 table 的途中加密数据,但我现在需要在检索数据时保持数据加密。我不确定这是否是 EncryptedType
支持的东西,或者是否有任何其他方法可以使用 SQLAlchemy 来执行此操作,而无需在我认为是密码库的情况下自己滚动。
我的例子table:
class MyTable(db.Model):
__tablename__ = "my_table"
id = db.Column(db.Integer, primary_key=True, autoincrement="auto")
name = db.Column(db.String(50), nullable=False)
username = db.Column(EncryptedType(db.String, _key), nullable=True)
password = db.Column(EncryptedType(db.String, _key), nullable=True)
我发现使用加密库(EncryptedType
用来处理加密)是这里最简单的解决方案。
我向模型 class 添加了一个 __init__
方法并在那里处理了加密。
from cryptography.fernet import Fernet
key = "my_encryption_key_here"
class MyTable(db.Model):
__tablename__ = "my_table"
id = db.Column(db.Integer, primary_key=True, autoincrement="auto")
name = db.Column(db.String(50), nullable=False)
username = db.Column(EncryptedType(db.String, _key), nullable=True)
password = db.Column(EncryptedType(db.String, _key), nullable=True)
auth_password = db.Column(EncryptedType(db.String, _key), nullable=True)
def __init__(self, name, username, password, auth_password):
cipher_suite = Fernet(key)
self.name = name
self.username = cipher_suite.encrypt(bytes(username))
self.password = cipher_suite.encrypt(bytes(password))
目前,我使用 sqlalchemy_utils
中的 EncryptedType
,以便在进入 table 的途中自动加密数据,并在从 [=18] 检索数据时解密数据=],使用一些预定义的字符串作为加密密钥。这工作正常,但现在要求已经改变,虽然我仍然需要在进入 table 的途中加密数据,但我现在需要在检索数据时保持数据加密。我不确定这是否是 EncryptedType
支持的东西,或者是否有任何其他方法可以使用 SQLAlchemy 来执行此操作,而无需在我认为是密码库的情况下自己滚动。
我的例子table:
class MyTable(db.Model):
__tablename__ = "my_table"
id = db.Column(db.Integer, primary_key=True, autoincrement="auto")
name = db.Column(db.String(50), nullable=False)
username = db.Column(EncryptedType(db.String, _key), nullable=True)
password = db.Column(EncryptedType(db.String, _key), nullable=True)
我发现使用加密库(EncryptedType
用来处理加密)是这里最简单的解决方案。
我向模型 class 添加了一个 __init__
方法并在那里处理了加密。
from cryptography.fernet import Fernet
key = "my_encryption_key_here"
class MyTable(db.Model):
__tablename__ = "my_table"
id = db.Column(db.Integer, primary_key=True, autoincrement="auto")
name = db.Column(db.String(50), nullable=False)
username = db.Column(EncryptedType(db.String, _key), nullable=True)
password = db.Column(EncryptedType(db.String, _key), nullable=True)
auth_password = db.Column(EncryptedType(db.String, _key), nullable=True)
def __init__(self, name, username, password, auth_password):
cipher_suite = Fernet(key)
self.name = name
self.username = cipher_suite.encrypt(bytes(username))
self.password = cipher_suite.encrypt(bytes(password))