[Python] Encryption at rest
Manlio Perillo
manlio.perillo a gmail.com
Gio 5 Apr 2018 14:55:46 CEST
2018-04-05 10:35 GMT+02:00 Lorenzo Mainardi <lormayna a gmail.com>:
> Buongiorno a tutti,
> ho una webapp che usa Flask + SQLAlchemy. Mi devo mettere in regola con il
> GDPR usando un prodotto esterno che cifra/decifra al volo alcuni campi del
> DB.
> Ad esempio: supponiamo che io abbia il numero di carta di credito
> 1234-5678-8765-4321.
> Quando lo voglio scrivere nel db passo il numero della carta di credito al
> servizio (tramite una API REST) e lui mi ritorna il dato cifrato
> 0000-1111-2222-3333 che poi vado a salvare nel db.
>
> Quando voglio leggere un dato dal DB, devo fare il contrario.
>
> Come posso integrare questa roba con SQLAlchemy?
> Avevo pensato di usare un decoratore, ma poi mi sono un po' arenato.
>
Puoi utilizzare un tipo personalizzato:
http://docs.sqlalchemy.org/en/latest/core/custom_types.html#augmenting-existing-types
Il problema รจ passare i parametri per l'API esterna che usi, ma li
puoi salvare come variabili globali o salvarli nell'instanza di
dialect che viene passato ai metodi del tipo personalizzato.
Ad esempio:
class SecureString(types.TypeDecorator):
'''Encrypt Unicode values using some API.
'''
impl = types.Unicode
def process_bind_param(self, value, dialect):
return api.encrypt(value, dialect.encrypt_api_params)
def process_result_value(self, value, dialect):
return api.decrypt(value, dialect.encrypt_api_params)
def copy(self, **kw):
return MyType(self.impl.length)
engine = create_engine('postgresql://scott:tiger@localhost:5432/mydatabase')
engine.dialect.encrypt_api_params = {
'a': 1,
'b': 2
}
Manlio
Maggiori informazioni sulla lista
Python