Postgresql e dati criptati

Postgresql e dati criptati

PostgreSQL e pgcrypto: come proteggere i dati con crittografia

Nel mio video su come cifrare i dati in PostgreSQL (👉 guarda qui) ho mostrato la pratica; qui approfondisco cosa c’è dietro pgcrypto e come lo uso concretamente quando devo proteggere campi sensibili a livello di database.


Perché mi serve pgcrypto

PostgreSQL di default non cifra automaticamente nulla. Se un database viene compromesso o qualcuno accede alle tabelle senza autorizzazione, tutti i dati sono leggibili in chiaro — email, dati anagrafici, qualsiasi cosa. pgcrypto è l’estensione che uso quando ho bisogno di cifrare specifici campi sensibili direttamente a livello di database, senza dover gestire la crittografia lato applicazione.

Con pgcrypto puoi: calcolare hash sicuri (SHA-256 e altri), fare crittografia simmetrica e asimmetrica, generare byte casuali o UUID, hashare password in modo sicuro.

Hashing

La funzione digest() calcola un hash usando algoritmi come SHA-256, SHA-512 o MD5:

SELECT digest('password123', 'sha256');

Crittografia simmetrica

Per cifrare e decifrare dati con una chiave segreta:

SELECT pgp_sym_encrypt('mio dato sensibile', 'mia_chiave_segretissima');

Per decifrare:

SELECT pgp_sym_decrypt(campo_cifrato, 'mia_chiave_segretissima');

Generare valori casuali o UUID

SELECT gen_random_bytes(16);
SELECT gen_random_uuid();

Esempio pratico che uso spesso

Supponi di avere una tabella utenti con l’email da proteggere:

ALTER TABLE utenti ADD COLUMN email_cifrata bytea;

UPDATE utenti
SET email_cifrata = pgp_sym_encrypt(email, 'chiave_segretissima');

-- A questo punto puoi valutare di rimuovere la colonna email in chiaro

Per leggerla:

SELECT pgp_sym_decrypt(email_cifrata, 'chiave_segretissima') AS email
FROM utenti;

Cosa tengo sempre a mente

pgcrypto richiede che PostgreSQL sia compilato con supporto OpenSSL — senza, l’estensione non è disponibile. Le funzioni girano dentro il server database, quindi se la connessione client-server non è cifrata via SSL, i dati passano comunque in chiaro durante il transito: usa sempre SSL sulla connessione, la cifratura a livello di colonna non sostituisce quella del trasporto.

L’altro punto su cui insisto sempre: pgcrypto cifra solo quello che scegli esplicitamente di cifrare, non l’intero database. Va pianificato bene quali campi trattare, e soprattutto va pianificata la gestione delle chiavi — una chiave persa significa dati irrecuperabili, una chiave esposta nello stesso posto dei dati cifrati vanifica la protezione.

👉 Nel video trovo installazione, esempi reali ed errori comuni da evitare: https://youtu.be/hIdiw__UUak