L'authentification est le videur à l'entrée de votre application. Chaque fois que quelqu'un s'inscrit ou se connecte, votre système doit décider s'il est bien celui qu'il prétend être. Si vous vous trompez, vous ne vous contentez pas de déboguer une erreur de connexion. Vous risquez de voir les données réelles de vos utilisateurs s'échapper purement et simplement. Pour faire cela correctement, deux outils fiables sont nécessaires : Bcrypt pour protéger les mots de passe au repos, et les JSON Web Tokens pour vérifier l'identité pendant que l'utilisateur navigue dans votre application.

Pourquoi le stockage en clair échoue

Si vous ne devez retenir qu'une seule règle de cet article, que ce soit celle-ci : ne stockez jamais de mots de passe en clair dans votre base de données. Peu importe que votre base de données soit derrière un pare-feu ou que vous fassiez confiance à chaque ingénieur de l'équipe. Écrire des mots de passe dans des tables sous leur forme brute revient à laisser les clés de la maison sous le paillasson. Dès que quelqu'un accède à cette base de données — via une API mal configurée, une sauvegarde fuitée ou une attaque par injection — chaque identifiant est instantanément exposé.

Les dégâts se multiplient car les gens réutilisent leurs mots de passe. Une seule faille peut compromettre non seulement votre application, mais aussi les comptes e-mail, bancaires et de réseaux sociaux d'un utilisateur. C'est pourquoi nous hachons les mots de passe. Le hachage transforme le mot de passe en une chaîne de caractères brouillée qui ne présente aucune ressemblance évidente avec l'original. Le processus est unidirectionnel et irréversible. Vous ne pouvez pas verser d'acide mathématique sur un hash pour le dissoudre et retrouver le mot de passe qui l'a créé.

Hachage des mots de passe avec Bcrypt

Bcrypt est une fonction de hachage conçue spécifiquement pour les mots de passe. Elle prend la chaîne en clair, la fait passer par le chiffrement Blowfish et renvoie un résultat qui ressemble à ceci : $2b$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy. Ce préfixe vous indique l'algorithme et le facteur de coût. La longue suite de caractères est une combinaison du sel (salt) et du hash lui-même.

Le sel est une donnée aléatoire mélangée au mot de passe avant que le hachage ne commence. Comme le sel est unique pour chaque utilisateur, deux personnes choisissant toutes deux « password123 » se retrouveront avec des hashs complètement différents dans votre base de données. Cette différence triviale neutralise les tables arc-en-ciel (rainbow tables) — des dictionnaires de hashs précalculés pour les mots de passe courants — car les attaquants devraient régénérer la table entière pour chaque sel unique.

Bcrypt est également intentionnellement lent. Le matériel moderne peut deviner des milliards de hashs par seconde avec des algorithmes rapides comme SHA-256. Bcrypt, lui, traîne les pieds. Il exécute le processus de hachage plusieurs fois, contrôlé par un facteur de coût que vous pouvez augmenter à mesure que les ordinateurs deviennent plus rapides. Cette lenteur punit quiconque tente de forcer une base de données volée par force brute. Un utilisateur légitime qui attend deux cents millisecondes de plus lors de la connexion ne s'en apercevra pas. Un attaquant essayant de tester des millions de combinaisons, en revanche, le remarquera certainement.

Comment fonctionnent les JSON Web Tokens

Tandis que Bcrypt gère la porte d'entrée, le JWT gère le laissez-passer pour les couloirs. Un JSON Web Token est une chaîne compacte et sûre pour les URL qui prouve qu'un utilisateur a déjà été authentifié. Considérez-le comme une carte d'identité numérique que le serveur délivre et que le client transporte avec lui.

Un JWT contient trois segments séparés par des points : l'en-tête (header), la charge utile (payload) et la signature. L'en-tête spécifie le type de jeton et l'algorithme de signature. La charge utile contient des revendications (claims) — des déclarations concernant l'utilisateur et le jeton lui-même — telles qu'un identifiant utilisateur, un nom d'utilisateur et un horodatage d'expiration. La signature est le sceau cryptographique. Le serveur la crée en encodant l'en-tête et la charge utile, puis en les passant à travers une clé secrète. Si quelqu'un altère la charge utile, la signature ne correspond plus, et le serveur rejette immédiatement le jeton.