[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