CodeGym /Corsi /SQL SELF /Esempi di cifratura dei dati a livello di tabelle e colon...

Esempi di cifratura dei dati a livello di tabelle e colonne

SQL SELF
Livello 48 , Lezione 2
Disponibile

Le informazioni che stanno nel database spesso valgono tantissimo per un’azienda. Ma, purtroppo, sono anche super appetibili per chi vuole fare casino. Ecco perché è importante pensare alla cifratura: è uno dei modi per proteggere i dati da occhi indiscreti.

La cifratura aiuta a tenere al sicuro le info sensibili: tipo password, numeri di carte di credito o dati personali. Serve anche per rispettare le leggi tipo GDPR o HIPAA. E se dovesse succedere una fuga di dati, quelli cifrati saranno molto meno vulnerabili, così il danno potenziale si riduce.

In PostgreSQL ci sono funzioni comode per la cifratura simmetrica. Con pgp_sym_encrypt(data, key) puoi cifrare i dati che ti servono, e poi decifrarli con pgp_sym_decrypt(encrypted_data, key) usando la stessa chiave. Facile — e sicuro.

Esempio di cifratura dei dati

Passo 1: Creazione della tabella

Creiamo una tabella users con una colonna che terrà i numeri di telefono cifrati:

-- Creazione della tabella con una colonna per i dati cifrati
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username TEXT NOT NULL,
    phone_encrypted BYTEA -- Qui ci saranno i numeri di telefono cifrati
);

Passo 2: Inserimento dei dati con cifratura

Adesso aggiungiamo un utente, cifrando il suo numero di telefono:

-- Inserimento dei dati con cifratura
INSERT INTO users (username, phone_encrypted)
VALUES ('john_doe', pgp_sym_encrypt('123-456-7890', 'my_secret_key'));

Occhio a come si usa la funzione pgp_sym_encrypt. my_secret_key è la nostra chiave simmetrica. Nella vita vera la chiave deve essere bella tosta e super protetta.

Passo 3: Estrazione dei dati con decifratura

Quando serve accedere ai dati, possiamo decifrarli così:

-- Estrazione dei dati con decifratura
SELECT 
    username, 
    pgp_sym_decrypt(phone_encrypted, 'my_secret_key') AS phone
FROM users;

Se la chiave è giusta, vedrai il numero di telefono originale.

Livello successivo: aggiungere la cifratura a una tabella già esistente

E se la tabella esiste già e vogliamo iniziare a cifrare i dati in una delle sue colonne? Vediamo come si fa.

Passo 1: Creazione di una nuova colonna

Supponiamo di avere una tabella customers e vogliamo cifrare le colonne con i numeri delle carte di credito:

-- Aggiunta di una nuova colonna per i dati cifrati
ALTER TABLE customers ADD COLUMN card_number_encrypted BYTEA;

Passo 2: Spostamento dei dati nella colonna cifrata

Cifriamo i dati esistenti e li spostiamo nella nuova colonna:

-- Cifratura dei dati e spostamento nella nuova colonna
UPDATE customers
SET card_number_encrypted = pgp_sym_encrypt(card_number, 'my_other_secret_key');

Passo 3: Eliminazione della colonna non cifrata

Dopo aver cifrato i dati, la vecchia colonna si può eliminare:

-- Eliminazione della vecchia colonna non cifrata
ALTER TABLE customers DROP COLUMN card_number;

Ora i dati sono protetti dalla cifratura e ci puoi accedere solo se hai la chiave.

Particolarità nel lavorare con dati cifrati

Ci sono alcune cose importanti da sapere quando lavori con colonne cifrate:

Tipo di dato:

  • I valori cifrati stanno in formato binario (BYTEA), non leggibili normalmente.
  • Quando fai query devi usare le funzioni di decifratura.

Ricerca e filtraggio:

  • Non puoi cercare direttamente le righe usando i dati cifrati, tipo:
  SELECT * FROM users WHERE phone_encrypted = '123-456-7890'; -- NON FUNZIONA!
  • Invece puoi decifrare i dati nella query:
  SELECT *
  FROM users
  WHERE pgp_sym_decrypt(phone_encrypted, 'my_secret_key') = '123-456-7890';

Performance:

Cifrare e decifrare i dati può rallentare le query. Usale solo dove serve davvero.

Scenario reale: protezione delle password

Conservare le password è uno dei casi più comuni per la cifratura. Invece di tenerle in chiaro (brutta idea), bisogna fare l’hashing.

Hashing della password usando pgcrypto

Useremo la funzione crypt() per fare hashing sicuro delle password:

-- Hashing della password quando inserisci il record
INSERT INTO users (username, phone_encrypted)
VALUES ('alice', crypt('la_mia_password_sicura', gen_salt('bf')));

Qui gen_salt('bf') crea il salt per l’hashing della password.

Per controllare la password, confrontiamo l’hash:

-- Confronto dell’hash della password
SELECT username
FROM users
WHERE crypt('la_mia_password_sicura', phone_encrypted) = phone_encrypted;

Consigli di sicurezza

  1. Tieni le chiavi separate:

Non salvare mai le chiavi simmetriche nello stesso database dei dati cifrati.

  1. Usa chiavi complesse:

Chiavi semplici tipo "123" sono facilissime da indovinare.

  1. Aggiorna regolarmente le chiavi:

Per evitare fughe di dati, è meglio cambiare le chiavi ogni tanto, ricifrando i dati.

Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION