SQLAlchemy шифрует столбец без автоматического дешифрования при получении

В настоящее время я использую EncryptedType от sqlalchemy_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)

1 ответ

Решение

Я обнаружил, что с помощью библиотеки криптографии, которая является то, что 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))
Другие вопросы по тегам