Rumah  >  Artikel  >  hujung hadapan web  >  Lindungi Token JWT daripada Pemalsuan Token dan Serangan Manipulasi Data

Lindungi Token JWT daripada Pemalsuan Token dan Serangan Manipulasi Data

王林
王林asal
2024-07-20 15:15:37667semak imbas

Protect JWT Token from Token Forgery and Data Manipulation Attack

pengenalan:

Token Web JSON (JWT) digunakan secara meluas untuk mendapatkan pengesahan API dan pertukaran data. Walau bagaimanapun, pelaksanaan dan pengendalian yang tidak betul boleh mendedahkan kelemahan yang membawa kepada pemalsuan token dan manipulasi data. Dalam blog ini, kami akan meneroka kelemahan biasa JWT, contoh serangan dunia sebenar dan amalan terbaik untuk mengurangkan risiko ini.

Apa itu JWT?

JWT ialah cara padat, selamat URL untuk mewakili tuntutan yang akan dipindahkan antara dua pihak. Ia terdiri daripada tiga bahagian: Pengepala, Muatan dan Tandatangan, dikodkan dalam Base64.

Struktur JWT:

{
  "header": {
    "alg": "HS256",
    "typ": "JWT"
  },
  "payload": {
    "sub": "1234567890",
    "name": "John Doe",
    "iat": 1516239022
  },
  "signature": "SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
}

Kerentanan JWT biasa:

1. Serangan Kekeliruan Algoritma:
Penyerang boleh mengeksploitasi algoritma yang lemah atau menukar algoritma dalam pengepala token kepada tiada, yang membawa kepada pemalsuan token.

Contoh:

{
  "alg": "none",
  "typ": "JWT"
}

Mitigasi:
Sentiasa sahkan parameter alg pada bahagian pelayan dan tolak token dengan algoritma "tiada" atau lemah.

Pelaksanaan Selamat:

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. Serangan Suntikan Utama:
Penyerang mungkin memanipulasi muatan untuk memasukkan kunci baharu, yang membawa kepada akses tanpa kebenaran.

Contoh:

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

Mitigasi:
Pastikan tuntutan disahkan dengan betul dan maklumat sensitif tidak disimpan dalam muatan.

Pelaksanaan Selamat:

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. Kunci Rahsia Lemah:
Menggunakan kunci rahsia yang lemah atau boleh diramal boleh menyebabkan serangan kekerasan.

Mitigasi:
Gunakan kunci rahsia yang kuat dan dijana secara rawak dan putarkannya dengan kerap.

Pelaksanaan Selamat:

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);
});

Contoh Pelaksanaan JWT Selamat Lengkap:

Berikut ialah contoh lengkap cara melaksanakan JWT dengan selamat dalam aplikasi Node.js:

Langkah 1: Pasang Ketergantungan

npm install jsonwebtoken express body-parser

Langkah 2: Buat Pelayan Mudah

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');
});

Amalan Terbaik untuk Pelaksanaan JWT Selamat:

  • Gunakan Algoritma Kuat: Lebih suka RS256 atau ES256 berbanding HS256 untuk keselamatan yang lebih baik.
  • Sahkan Tamat Tempoh Token: Sentiasa semak tuntutan exp untuk memastikan token tidak tamat tempoh.
  • Simpan Rahsia Dengan Selamat: Simpan kunci rahsia di lokasi yang selamat, seperti pembolehubah persekitaran atau peti besi selamat.
  • Laksanakan Pengendalian Ralat yang Betul: Elakkan daripada mendedahkan mesej ralat sensitif yang boleh membantu penyerang.
  • Gunakan HTTPS: Pastikan semua komunikasi melalui HTTPS untuk mengelakkan pemintasan token.

Kesimpulan:

Memahami dan mengurangkan kelemahan JWT adalah penting untuk mengekalkan keselamatan aplikasi anda. Dengan mengikuti amalan terbaik dan mengendalikan JWT dengan betul, anda boleh menghalang pemalsuan token dan manipulasi data, memastikan keselamatan API yang teguh.

Lindungi API anda sekarang dengan melaksanakan amalan terbaik ini untuk melindungi daripada kelemahan JWT!

Atas ialah kandungan terperinci Lindungi Token JWT daripada Pemalsuan Token dan Serangan Manipulasi Data. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn