Шифрование данных в Postgres и дешифрование из Postgres с использованием sqlalchemy и ORM
Я хочу зашифровать данные в Postgres, а затем расшифровать и прочитать из него. Я предпочитаю использовать sqlalchemy и ORM, но если это трудно сделать с помощью sqlalchemy и ORM, то мне интересно узнать и другие способы
Я попытался использовать приведенный ниже код: он шифруется в базе данных, но не запрашивает у меня ни ключа, ни чего-либо для расшифровки. Могу я узнать почему?
import sqlalchemy as sa
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy_utils import EncryptedType
from sqlalchemy_utils.types.encrypted.encrypted_type import AesEngine
secret_key = 'secretkey1234'
connection_string = '***********'
engine = create_engine(connection_string)
connection = engine.connect()
sa.orm.configure_mappers()
Session = sessionmaker(bind=connection)
session = Session()
Base = declarative_base()
class User(Base):
__tablename__ = "user"
id = sa.Column(sa.Integer, primary_key=True)
username = sa.Column(EncryptedType(sa.Unicode,secret_key,AesEngine,'pkcs5'))
number_of_accounts = sa.Column(EncryptedType(sa.Integer,secret_key,AesEngine,'oneandzeroes'))
Base.metadata.create_all(connection)
Я запускаю приведенный ниже код для расшифровки:
user_id = user.id
session.expunge_all()
user_instance = session.query(User).get(user_id)
print('username: {}'.format(user_instance.username))
1 ответ
Вы, вероятно, уже поняли это, так как этому вопросу несколько лет, но для всех, кто ищет:
Вы взаимодействуете со своими таблицами Postgres через определяемые вами классы моделей (в вашем примере).
Когда вы выполняете запрос, данные возвращаются и передаются через класс, чтобы определить, как обрабатывать ответ. Из вашего примера запрос вернет результаты для и . Если бы вы регистрировали каждый возвращенный элемент,
id
будет обрабатываться как
int
потому что именно так это определено в вашей модели.
Сходным образом,
username
а также
number_of_accounts
также будет обрабатываться на основе определения в
User
класс - как
EncryptedType()
ценность. Однако это более сложный тип данных. Ваша модель определяет ключ, используемый для шифрования/дешифрования. Перед сохранением значения результаты расшифровываются на основе контекста, предоставленного в вашей модели. В этом случае с помощью
AESEngine
и расшифровывается с помощью ключа
'secretkey1234'
. Вот почему вам не нужно указывать ключ при чтении. Он уже определен в вашей модели.
Если бы вы должны были запустить
select * from user limit 1;
запрашивать непосредственно в вашей базе данных Postgres, значения, отображаемые для ваших двух зашифрованных столбцов, останутся зашифрованными, так как вы не будете передавать результаты через определенную вами модель.