JSON Web 令牌 (JWT) 廣泛用於保護 API 驗證和資料交換。然而,不正確的實施和處理可能會暴露導致令牌偽造和資料操縱的漏洞。在本部落格中,我們將探討常見的 JWT 弱點、現實世界中的攻擊範例以及減輕這些風險的最佳實踐。
JWT 是一種緊湊、URL 安全的方式,用於表示在兩方之間傳輸的聲明。它由三個部分組成:Header、Payload、Signature,以Base64編碼。
智威湯遜結構:
{ "header": { "alg": "HS256", "typ": "JWT" }, "payload": { "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }, "signature": "SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" }
1.演算法混淆攻擊:
攻擊者可以利用弱演算法或將令牌頭中的演算法更改為無,從而導致令牌偽造。
例子:
{ "alg": "none", "typ": "JWT" }
減輕:
始終在伺服器端驗證 alg 參數,並拒絕使用「無」或弱演算法的令牌。
安全實施:
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.密鑰注入攻擊:
攻擊者可能會操縱有效負載以包含新金鑰,從而導致未經授權的存取。
例子:
{ "sub": "1234567890", "name": "John Doe", "admin": true }
減輕:
確保聲明得到正確驗證,且敏感資訊不會儲存在有效負載中。
安全實施:
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.弱密鑰:
使用較弱或可預測的密鑰可能會導致暴力攻擊。
減輕:
使用隨機產生的強密鑰並定期輪換它們。
安全實施:
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); });
以下是如何在 Node.js 應用程式中安全地實作 JWT 的完整範例:
第 1 步:安裝依賴項
npm install jsonwebtoken express body-parser
第 2 步:建立簡單伺服器
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'); });
了解和緩解 JWT 漏洞對於維護應用程式的安全至關重要。透過遵循最佳實踐並正確處理 JWT,您可以防止令牌偽造和資料操縱,從而確保強大的 API 安全性。
立即透過實施這些最佳實踐來保護您的 API,以防範 JWT 漏洞!
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3