JSON Web 令牌 (JWT) 廣泛用於保護 API 驗證和資料交換。然而,不正確的實施和處理可能會暴露導致令牌偽造和資料操縱的漏洞。在本部落格中,我們將探討常見的 JWT 弱點、現實世界中的攻擊範例以及減輕這些風險的最佳實踐。
JWT 是一種緊湊、URL 安全的方式,用於表示在兩方之間傳輸的聲明。它由三個部分組成:Header、Payload 和 Signature,以 Base64 編碼。
JWT 結構:
{ "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 安全性。
立即實作這些最佳實務以防止 JWT 漏洞,保護您的 API!
以上是保護 JWT 令牌免受令牌偽造和資料操縱攻擊的詳細內容。更多資訊請關注PHP中文網其他相關文章!