6

目前,我使用EncryptedTypefromsqlalchemy_utils是为了在进入表的过程中自动加密数据,并在从表中检索数据时解密数据,使用一些预定义的字符串作为加密密钥。这工作正常,但现在要求已经改变,虽然我仍然需要在进入表的过程中加密数据,但我现在需要在检索数据时保持数据加密。我不确定这是否EncryptedType支持,或者是否有任何其他方法可以使用 SQLAlchemy 做到这一点,而无需在我假设的密码库中滚动我自己。

我的表示例:

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)
4

1 回答 1

4

我发现EncryptedType使用用于处理加密的密码库是这里最简单的解决方案。

__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))
于 2018-03-29T17:43:54.597 回答