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