0
0
Lập trình
Sơn Tùng Lê
Sơn Tùng Lê103931498422911686980

Tấn Công JSON Web Tokens (JWT) - Phần 2: Tìm Hiểu Nguy Cơ và Biện Pháp Phòng Ngừa

Đăng vào 1 tháng trước

• 4 phút đọc

I. Tổng Quan Kiến Thức Cần Biết (Tiếp Theo)

5. Ưu Nhược Điểm Của JSON Web Tokens (JWT) và Các Lưu Ý Khi Sử Dụng

Ưu Điểm

  • Dữ liệu được mã hóa: JWT mã hóa thông tin người dùng bằng các thuật toán, giúp bảo mật dữ liệu trong quá trình truyền tải.
  • Tính tích hợp cao: JWT dễ dàng tích hợp vào nhiều ngôn ngữ lập trình và công nghệ hiện đại, phù hợp cho hầu hết các ứng dụng.
  • Dễ phát hiện thay đổi dữ liệu: Chữ ký số (signature) trong JWT cho phép người nhận xác minh tính toàn vẹn của dữ liệu một cách dễ dàng.
  • Cấu trúc linh hoạt: Có thể dễ dàng thêm thuộc tính vào payload, tạo điều kiện thuận lợi cho việc chia sẻ thông tin giữa các ứng dụng.

Nhược Điểm

  • Dữ liệu không được mã hóa: Phần header và payload không được mã hóa, khiến kẻ tấn công có thể đọc nội dung dễ dàng.
  • Khó khăn trong việc thu hồi token: Một khi token đã được tạo và phát hành, sẽ không thể thu hồi nếu nó bị đánh cắp.
  • Kích thước token lớn: JWT thường lớn hơn so với các phương pháp khác như session hay cookie, tiêu tốn băng thông.

6. Hướng Dẫn Tạo JWT Token

Bạn có thể tự tạo một JWT token bằng cách sử dụng thư viện JWT trong các ngôn ngữ lập trình, hoặc thực hiện thủ công bằng cách mã hóa và tạo chữ ký số với các thuật toán mã hóa. Dưới đây là ví dụ sử dụng thư viện PyJWT trong Python:

python Copy
import jwt

payload = {'user_id': 123456}
secret_key = 'my-secret-key'
algorithm = 'HS256'

jwt_token = jwt.encode(payload, secret_key, algorithm)
print(jwt_token)

Cách khác là tạo JWT token thủ công với OpenSSLRSA:

bash Copy
# Tạo khóa riêng tư RSA
openssl genpkey -algorithm RSA -out private_key.pem -aes256

# Tạo khóa công khai RSA từ khóa riêng tư
openssl rsa -pubout -in private_key.pem -out public_key.pem

# Mã hóa dữ liệu và tạo chữ ký số sử dụng khóa riêng tư
echo '{"user_id": 123456}' | openssl dgst -sha256 -sign private_key.pem | base64 | tr -d '\n'

# Tạo JWT token bằng payload và chữ ký số

echo '{"alg": "RS256", "typ": "JWT"}' | base64 | tr -d '\n'; echo '.'; echo '{"user_id": 123456}' | base64 | tr -d '\n'; echo '.'; echo "<chữ ký số đã tạo>"

II. Các Phương Pháp Tấn Công JWT

Trong phần trước, chúng ta đã tìm hiểu về JSON Web Tokens (JWT). Bên cạnh những lợi ích, cần lưu ý rằng JWT cũng tiềm ẩn nhiều nguy cơ an ninh. Các phương pháp tấn công JWT hầu hết nhằm mục tiêu xâm nhập hoặc giả mạo JWT không hợp lệ. Một số phương pháp phổ biến bao gồm:

  • Giả Mạo Chữ Ký JWT: Kẻ tấn công thay đổi chữ ký của JWT, tạo ra một JWT mới mà server vẫn tin tưởng.
  • Thay Đổi Thông Tin JWT: Thay đổi các thông tin trong JWT, như giá trị của các trường iss, sub, aud để tạo ra một JWT mới.
  • Tấn Công Brute-force: Kẻ tấn công cố gắng đoán ra secret key bằng cách thử nhiều giá trị khác nhau.
  • Tấn Công Mã Hóa JWT: Giả mạo JWT mới bằng cách mã hóa thông tin từ JWT đã xác thực.
  • Tấn Công Theo Thời Gian: Phân tích thời gian phản hồi từ server để rút ra thông tin từ JWT.

III. Phân Tích Các Phương Pháp Tấn Công JWT Và Biện Pháp Phòng Ngừa

1. Thay Đổi Giá Trị Thông Tin JWT

Quy trình xử lý JWT từ server thường thực hiện như sau:

  • Tiếp nhận JWT từ người dùng và xác thực bằng chữ ký.
  • Giải mã JWT nếu hợp lệ để lấy thông tin trong payload.

Một trong những lỗi phổ biến khi lập trình là không xác thực token, dẫn đến việc kẻ tấn công có thể giả mạo thông tin trong payload. Ví dụ, nếu lập trình viên chỉ dùng hàm decode() mà không kiểm tra tính hợp lệ:

javascript Copy
const jwt = require('jsonwebtoken');
const secret = 'secret_key';

const token = req.headers.authorization.split(' ')[1];
const isAdmin = decoded.admin;
if (isAdmin) {
    res.redirect('/admin');
} else {
    res.redirect('/user');
}

Kẻ tấn công dễ dàng thay đổi trường isAdmin thành true mà không có bất kỳ biện pháp nào để kiểm tra tính hợp lệ của token.

Các lập trình viên cần chắc chắn phải kiểm tra tính hợp lệ của JWT bằng:

javascript Copy
jwt.verify(token, secret, (err, decoded) => {
  if (err) {
    // Xử lý lỗi xác thực JWT
  } else {
    // Giải mã JWT ...
  }
});

Tài Liệu Tham Khảo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào