Les jetons Web JSON (JWT) sont largement utilisés pour sécuriser l'authentification API et l'échange de données. Cependant, une mise en œuvre et une gestion inappropriées peuvent exposer des vulnérabilités conduisant à la falsification de jetons et à la manipulation de données. Dans ce blog, nous explorerons les faiblesses courantes de JWT, des exemples concrets d'attaques et les meilleures pratiques pour atténuer ces risques.
JWT est un moyen compact et sécurisé pour les URL de représenter les réclamations à transférer entre deux parties. Il se compose de trois parties : en-tête, charge utile et signature, codées en Base64.
Structure JWT :
{ "header": { "alg": "HS256", "typ": "JWT" }, "payload": { "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }, "signature": "SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" }
1. Attaque de confusion d'algorithme :
Les attaquants peuvent exploiter des algorithmes faibles ou remplacer l'algorithme dans l'en-tête du jeton par aucun, conduisant à une falsification de jeton.
Exemple :
{ "alg": "none", "typ": "JWT" }
Atténuation :
Validez toujours le paramètre alg côté serveur et rejetez les jetons avec « aucun » ou des algorithmes faibles.
Mise en œuvre sécurisée :
const jwt = require('jsonwebtoken'); const payload = { sub: "1234567890", name: "John Doe" }; const secret = 'your-256-bit-secret'; const token = jwt.sign(payload, secret, { algorithm: 'HS256' }); jwt.verify(token, secret, { algorithms: ['HS256'] }, function(err, decoded) { if (err) throw new Error('Token verification failed'); console.log(decoded); });
2. Attaque par injection de clé :
Les attaquants pourraient manipuler la charge utile pour inclure une nouvelle clé, conduisant ainsi à un accès non autorisé.
Exemple :
{ "sub": "1234567890", "name": "John Doe", "admin": true }
Atténuation :
Assurez-vous que les réclamations sont correctement validées et que les informations sensibles ne sont pas stockées dans la charge utile.
Mise en œuvre sécurisée :
const payload = { sub: "1234567890", name: "John Doe" }; const token = jwt.sign(payload, secret, { algorithm: 'HS256' }); jwt.verify(token, secret, function(err, decoded) { if (err) throw new Error('Token verification failed'); if (decoded.admin) throw new Error('Unauthorized access'); console.log(decoded); });
3. Clé secrète faible :
L'utilisation de clés secrètes faibles ou prévisibles peut conduire à des attaques par force brute.
Atténuation :
Utilisez des clés secrètes solides générées aléatoirement et faites-les pivoter régulièrement.
Mise en œuvre sécurisée :
const crypto = require('crypto'); const secret = crypto.randomBytes(64).toString('hex'); const token = jwt.sign(payload, secret, { algorithm: 'HS256' }); jwt.verify(token, secret, function(err, decoded) { if (err) throw new Error('Token verification failed'); console.log(decoded); });
Voici un exemple complet de la façon d'implémenter en toute sécurité JWT dans une application Node.js :
Étape 1 : Installer les dépendances
npm install jsonwebtoken express body-parser
Étape 2 : Créer un serveur simple
const express = require('express'); const bodyParser = require('body-parser'); const jwt = require('jsonwebtoken'); const crypto = require('crypto'); const app = express(); app.use(bodyParser.json()); const secret = crypto.randomBytes(64).toString('hex'); app.post('/login', (req, res) => { const { username, password } = req.body; // Authenticate user (dummy check for example) if (username === 'user' && password === 'pass') { const payload = { username }; const token = jwt.sign(payload, secret, { algorithm: 'HS256', expiresIn: '1h' }); res.json({ token }); } else { res.status(401).json({ message: 'Invalid credentials' }); } }); app.get('/protected', (req, res) => { const token = req.headers['authorization']; if (!token) return res.status(403).json({ message: 'No token provided' }); jwt.verify(token, secret, { algorithms: ['HS256'] }, (err, decoded) => { if (err) return res.status(500).json({ message: 'Failed to authenticate token' }); res.json({ message: 'Access granted', user: decoded }); }); }); app.listen(3000, () => { console.log('Server running on port 3000'); });
Comprendre et atténuer les vulnérabilités JWT est crucial pour maintenir la sécurité de vos applications. En suivant les meilleures pratiques et en gérant correctement les JWT, vous pouvez empêcher la falsification de jetons et la manipulation de données, garantissant ainsi une sécurité robuste de l'API.
Sécurisez vos API dès maintenant en mettant en œuvre ces bonnes pratiques pour vous protéger contre les vulnérabilités JWT !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!