Latest Post

Khái niệm về Solidity và tổng quan về ngôn ngữ lập trình Solidity Phương pháp kiểm tra nhiệt độ CPU đơn giản

Giải mã và xác minh JWT Token trong Java là một kỹ thuật phổ biến trong bảo mật API, giúp ứng dụng đọc dữ liệu và xác minh tính toàn vẹn của Token. Dưới đây là tóm tắt chi tiết và dễ hiểu từ nội dung bạn đã cung cấp:


1. JWT là gì?

JWT (JSON Web Token) bao gồm 3 phần chính:

  • Header: Chứa thông tin về thuật toán mã hóa.
  • Payload: Chứa dữ liệu người dùng (yêu cầu).
  • Signature: Xác minh tính toàn vẹn của dữ liệu.

JWT được biểu diễn dưới dạng chuỗi, mỗi phần được mã hóa Base64 và ngăn cách bởi dấu chấm (.).


2. Giải mã JWT

Giải mã cho phép đọc thông tin từ headerpayload. Ví dụ:

String[] chunks = token.split("\\."); // Tách JWT thành các phần
Base64.Decoder decoder = Base64.getUrlDecoder();

// Giải mã header và payload
String header = new String(decoder.decode(chunks[0]));
String payload = new String(decoder.decode(chunks[1]));

System.out.println("Header: " + header);
System.out.println("Payload: " + payload);

Với JWT:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkJhZWxkdW5nIFVzZXIiLCJpYXQiOjE1MTYyMzkwMjJ9.qH7Zj_m3kY69kxhaQXTa-ivIpytKXXjZc1ZSmapZnGE

Kết quả giải mã:

  • Header: {"alg":"HS256","typ":"JWT"}
  • Payload: {"sub":"1234567890","name":"Baeldung User","iat":1516239022}

3. Xác minh JWT

Xác minh đảm bảo rằng dữ liệu trong headerpayload không bị thay đổi.

3.1. Thêm thư viện jjwt

Thêm jjwt vào pom.xml (nếu dùng Maven):

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.7.0</version>
</dependency>

3.2. Xác minh chữ ký

  • Lấy thuật toán (alg) từ header:
SignatureAlgorithm sa = SignatureAlgorithm.HS256;
SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), sa.getJcaName());
  • So sánh signature:
String tokenWithoutSignature = chunks[0] + "." + chunks[1];
String signature = chunks[2];

DefaultJwtSignatureValidator validator = new DefaultJwtSignatureValidator(sa, secretKeySpec);

if (!validator.isValid(tokenWithoutSignature, signature)) {
    throw new Exception("JWT không hợp lệ!");
}

Trong đó:

  • tokenWithoutSignature: Header và Payload.
  • signature: Phần chữ ký từ JWT.
  • Trình xác thực sẽ tạo một chữ ký mới và so sánh với chữ ký trong JWT.

4. Lưu ý quan trọng

  • JWT không mã hóa dữ liệu, nên thông tin trong header và payload có thể bị đọc bởi bất kỳ ai.
  • Chữ ký đảm bảo rằng dữ liệu không bị sửa đổi, nhưng bạn cần khóa bí mật (secretKey) để xác minh.
  • Đừng lưu trữ thông tin nhạy cảm trong payload.

5. Kết luận

  • Bạn có thể giải mã JWT để đọc thông tin.
  • Sử dụng chữ ký và thuật toán phù hợp để đảm bảo tính toàn vẹn của JWT.
  • Khi làm việc với JWT, hãy sử dụng thư viện mạnh mẽ như jjwt để giảm thiểu lỗi và bảo mật tốt hơn.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *