T’as déjà entendu parler de vol de données ? Oh, c’est pas juste un scénario de film hollywoodien. Les boîtes perdent des millions à cause de fuites de données, et leur réputation s’effondre comme un château de cartes. Pour éviter ça, il faut absolument protéger les données. Un des moyens les plus puissants — c’est le chiffrement.
Le chiffrement, c’est une méthode pour transformer des données en un "code secret" que personne ne peut comprendre sans la clé de déchiffrement. Dans PostgreSQL, il y a une super extension qui s’appelle pgcrypto et qui rend le chiffrement de tes données super simple.
pgcrypto — c’est une extension PostgreSQL qui te file des outils puissants pour chiffrer et déchiffrer des données, bosser avec des hash et générer des données aléatoires.
Fonctionnalités principales de pgcrypto :
- Chiffrement symétrique (une seule clé) et asymétrique (paire de clés : privée et publique).
- Hashage des données pour les vérifier (genre les mots de passe).
- Génération de données aléatoires, que tu peux utiliser pour créer des tokens, des clés et des mots de passe.
Voilà comment activer pgcrypto dans ta base. Si tu pensais que la magie c’était réservé aux sorciers de Poudlard, laisse PostgreSQL te surprendre.
-- Activation de l’extension pgcrypto
CREATE EXTENSION IF NOT EXISTS pgcrypto;
Chiffrement symétrique : On code tes secrets
Fonctions pour chiffrer et déchiffrer :
pgp_sym_encrypt(data, key)— chiffre des données avec une clé symétrique.pgp_sym_decrypt(data, key)— déchiffre des données chiffrées avec la même clé.
Exemple : chiffrer un texte simple
Imaginons qu’on a une table users avec une colonne email, et qu’on veut chiffrer les adresses email.
-- Création de la table users
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email TEXT
);
-- Insertion des données
INSERT INTO users (email)
VALUES ('user1@example.com'), ('user2@example.com');
-- Chiffrement des données
UPDATE users
SET email = pgp_sym_encrypt(email, 'supersecretkey');
-- Vérification du résultat
SELECT * FROM users;
Résultat : dans la colonne email, tu verras maintenant du texte chiffré, qui ressemble à un truc incompréhensible.
Déchiffrement des données
Quand tu veux retrouver les données originales, utilise la fonction pgp_sym_decrypt.
-- Déchiffrement des données
SELECT pgp_sym_decrypt(email::bytea, 'supersecretkey') AS original_email
FROM users;
Remarque : ne sois pas radin sur les clés. Une clé genre "123456", c’est comme mettre un mot de passe sur ta porte et la laisser grande ouverte. Utilise des clés longues et bien compliquées.
Hashage des données : la protection des mots de passe sous stéroïdes
Stocker les mots de passe en clair dans la base, c’est comme cacher ton journal intime sous l’oreiller dans une coloc. Fais pas ça ! Utilise plutôt le hashage.
Fonction pour hasher : crypt(password, gen_salt('bf')) — crée un hash pour la chaîne password en utilisant l’algorithme Blowfish.
-- Exemple de hashage de mot de passe
SELECT crypt('mon_mot_de_passe', gen_salt('bf'));
Le résultat va ressembler à ça : $2a$10$Efgnd3tFs3tOH6r3RgW5/uLPhNTa43k5E2C5Ut0Ydo7RNHZjG.vi.
Pour vérifier un mot de passe, utilise la même fonction :
-- Vérification du mot de passe
SELECT crypt('mon_mot_de_passe', '$2a$10$Efgnd3tFs3tOH6r3RgW5/uLPhNTa43k5E2C5Ut0Ydo7RNHZjG.vi')
= '$2a$10$Efgnd3tFs3tOH6r3RgW5/uLPhNTa43k5E2C5Ut0Ydo7RNHZjG.vi';
Résultat : true.
Petit conseil : ne stocke jamais les mots de passe en clair. Même si tu penses que ta base est ultra-sécurisée, utilise toujours des hash.
Chiffrement asymétrique : Deux clés, c’est mieux qu’une
Le chiffrement asymétrique utilise deux clés :
- Clé publique (pour chiffrer).
- Clé privée (pour déchiffrer).
Exemple : chiffrement avec une clé publique
-- Création d’une paire de clés (pour l’exemple, on les stocke dans des variables)
DO $$
DECLARE
public_key TEXT;
private_key TEXT;
BEGIN
SELECT pgp_keygen_keys(1024, 'ma_phrase_de_passe')
INTO public_key, private_key;
RAISE NOTICE 'Clé publique : %', public_key;
RAISE NOTICE 'Clé privée : %', private_key;
END $$;
Utilisation du chiffrement asymétrique
Les systèmes modernes utilisent souvent le chiffrement asymétrique pour échanger des données, par exemple dans les connexions SSL.
Génération de données aléatoires
Pour créer des tokens ou des clés aléatoires, utilise la fonction gen_random_uuid ou gen_random_bytes.
Exemple :
-- Génération d’un UUID aléatoire
SELECT gen_random_uuid();
-- Génération d’un tableau d’octets aléatoires
SELECT gen_random_bytes(16);
C’est super utile pour créer des identifiants uniques, des tokens d’accès ou des mots de passe aléatoires.
Scénarios d’utilisation de pgcrypto
- Chiffrement des données sensibles :
- Numéros de cartes bancaires.
- Données personnelles des clients (genre adresses, numéros de téléphone).
- Dossiers médicaux.
Hashage des mots de passe : Assure-toi que même l’admin de la base ne peut pas voir les mots de passe des utilisateurs.
Transmission sécurisée des données : Utilisation du chiffrement asymétrique pour envoyer des infos chiffrées.
Génération de tokens : Création de tokens pour l’authentification des utilisateurs d’API.
Erreurs classiques avec le chiffrement
Stocker les clés dans des endroits accessibles. Ne stocke jamais les clés de chiffrement en clair dans la base. Utilise des gestionnaires de secrets pour ça.
Utiliser des clés faibles. Si ta clé de chiffrement est trop courte, quelqu’un peut la deviner.
Chiffrer sans raison. Le chiffrement consomme des ressources. Utilise-le seulement là où c’est vraiment nécessaire.
Oublier quelle clé a été utilisée. Si tu n’as pas de doc, tu risques de ne plus pouvoir déchiffrer tes données.
Le chiffrement, c’est pas compliqué, c’est juste logique pour protéger tes données. Mets pgcrypto dans tes projets, et tu rendras tes bases non seulement plus sûres, mais aussi plus proches des standards du monde moderne. PostgreSQL te donne tout ce qu’il faut pour transformer tes données en vraie forteresse.
GO TO FULL VERSION