CodeGym /Corsi /SQL SELF /Introduzione alla cifratura dei dati con pgcrypto

Introduzione alla cifratura dei dati con pgcrypto

SQL SELF
Livello 48 , Lezione 1
Disponibile

Hai mai sentito parlare di furto di dati? Oh, non è solo roba da film hollywoodiani. Le aziende perdono milioni di euro per le fughe di dati e la loro reputazione crolla come un castello di carte. Per evitare tutto questo, i dati vanno protetti per forza. Uno dei metodi più potenti è la cifratura.

La cifratura è un modo per trasformare i dati in un "codice segreto" che non si può capire senza avere la chiave giusta per decifrarli. In PostgreSQL c'è una fantastica estensione chiamata pgcrypto che rende super facile cifrare i tuoi dati.

pgcrypto è un'estensione di PostgreSQL che ti dà strumenti potenti per cifrare e decifrare dati, lavorare con hash e generare dati casuali.

Funzionalità principali di pgcrypto:

  1. Cifratura simmetrica (una chiave sola) e asimmetrica (coppia di chiavi: privata e pubblica).
  2. Hash dei dati per verificarli (tipo le password).
  3. Generazione di dati casuali che puoi usare per creare token, chiavi e password.

Ecco come collegare pgcrypto al tuo database. Se pensavi che la magia fosse solo per i maghi di Hogwarts, lascia che PostgreSQL ti sorprenda.

-- Collegamento dell'estensione pgcrypto
CREATE EXTENSION IF NOT EXISTS pgcrypto;

Cifratura simmetrica: Codifichiamo i tuoi segreti

Funzioni per cifrare e decifrare:

  1. pgp_sym_encrypt(data, key) — cifra i dati usando una chiave simmetrica.
  2. pgp_sym_decrypt(data, key) — decifra i dati cifrati con la stessa chiave.

Esempio: cifratura di un testo semplice

Supponiamo di avere una tabella users con una colonna email e vogliamo cifrare gli indirizzi email.

-- Creiamo la tabella users
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    email TEXT
);

-- Inseriamo i dati
INSERT INTO users (email)
VALUES ('user1@example.com'), ('user2@example.com');

-- Cifriamo i dati
UPDATE users
SET email = pgp_sym_encrypt(email, 'supersecretkey');

-- Controlliamo il risultato
SELECT * FROM users;

Risultato: nella colonna email ora c'è un testo cifrato che sembra una serie di caratteri senza senso.

Decifrare i dati

Quando vuoi riportare i dati alla forma originale, usa la funzione pgp_sym_decrypt.

-- Decifrare i dati
SELECT pgp_sym_decrypt(email::bytea, 'supersecretkey') AS original_email
FROM users;

Nota: non risparmiare sulle chiavi. Una chiave tipo "123456" è come mettere una password alla porta e poi lasciarla aperta. Usa chiavi lunghe e complicate.

Hash dei dati: protezione delle password al massimo

Salvare le password in chiaro nel database è come nascondere il diario sotto il cuscino in una casa condivisa. Non farlo mai! Usa invece l'hash.

Funzione per l'hash: crypt(password, gen_salt('bf')) — crea un hash per la stringa password usando l'algoritmo Blowfish.

-- Esempio di hash di una password
SELECT crypt('mia_password', gen_salt('bf'));

Il risultato sarà qualcosa tipo: $2a$10$Efgnd3tFs3tOH6r3RgW5/uLPhNTa43k5E2C5Ut0Ydo7RNHZjG.vi.

Per verificare la password, usa la stessa funzione:

-- Verifica della password
SELECT crypt('mia_password', '$2a$10$Efgnd3tFs3tOH6r3RgW5/uLPhNTa43k5E2C5Ut0Ydo7RNHZjG.vi') 
       = '$2a$10$Efgnd3tFs3tOH6r3RgW5/uLPhNTa43k5E2C5Ut0Ydo7RNHZjG.vi';

Risultato: true.

Consiglio: non salvare mai le password in chiaro. Anche se pensi che il tuo database sia super sicuro, usa sempre gli hash.

Cifratura asimmetrica: Due chiavi sono meglio di una

La cifratura asimmetrica usa due chiavi:

  1. Chiave pubblica (per cifrare).
  2. Chiave privata (per decifrare).

Esempio: cifratura con chiave pubblica

-- Creiamo una coppia di chiavi (per semplicità le salviamo in variabili)
DO $$
DECLARE
    public_key TEXT;
    private_key TEXT;
BEGIN
    SELECT pgp_keygen_keys(1024, 'mia_passphrase')
    INTO public_key, private_key;

    RAISE NOTICE 'Chiave pubblica: %', public_key;
    RAISE NOTICE 'Chiave privata: %', private_key;
END $$;

Uso della cifratura asimmetrica

I sistemi moderni usano spesso la cifratura asimmetrica per scambiarsi dati, tipo nelle connessioni SSL.

Generazione di dati casuali

Per creare token o chiavi casuali usa la funzione gen_random_uuid o gen_random_bytes.

Esempio:

-- Generazione di un UUID casuale
SELECT gen_random_uuid();

-- Generazione di un array di byte casuali
SELECT gen_random_bytes(16);

Questo è utile per creare identificatori unici, token di accesso o password casuali.

Scenari d'uso di pgcrypto

  1. Cifratura di dati sensibili:
  • Numeri di carte di credito.
  • Dati personali dei clienti (tipo indirizzi, numeri di telefono).
  • Cartelle cliniche.
  1. Hash delle password: Assicurati che nemmeno l'amministratore del database possa vedere le password degli utenti.

  2. Trasmissione sicura dei dati: Usa la cifratura asimmetrica per inviare informazioni cifrate.

  3. Generazione di token: Crea token per l'autenticazione degli utenti API.

Errori tipici quando si lavora con la cifratura

Salvare le chiavi in posti accessibili. Non salvare mai le chiavi di cifratura in chiaro nel database. Usa i secret manager per questo.

Usare chiavi deboli. Se la chiave di cifratura è troppo corta, qualcuno potrebbe indovinarla.

Cifrare senza motivo. La cifratura richiede più risorse per gestire i dati. Usala solo dove serve davvero.

Dimenticare quale chiave hai usato. Se manca la documentazione, rischi di non poter più decifrare i dati.

Cifrare non è difficile, è solo un passo logico per proteggere i tuoi dati. Inizia a usare pgcrypto nei tuoi progetti e renderai i database non solo sicuri, ma anche più vicini agli standard richiesti oggi. PostgreSQL ti dà tutti gli strumenti per trasformare i tuoi dati in una fortezza inespugnabile.

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