编码/加密技术 AES、JWT、Base64
- Base64 编码
将任意字节流(图片、二进制文件、中文等任意数据)转换成ASCII码 → 转换成01二进制 字节数补0凑够6的倍数 剩余不足4个字符用=补位 每6位一组转成十进制 → 映射Base64表
谁都可以解码出明文
Base64 解决的问题
![image]()
// 原始JWT payload(JSON格式)
{"userId":123,"name":"张三"}
// 直接放HTTP头会出问题:
// 1. 包含中文(非ASCII)
// 2. 包含引号和花括号,可能被解析器误截断
// Base64 编码后:
eyJ1c2VySWQiOjEyMywibmFtZSI6IuW8oOS4iSJ9
// 只有 A-Z a-z 0-9 + / =,完全安全
// Base64 编码
String original = "Hello World";
String encoded = Base64.getEncoder().encodeToString(original.getBytes());
// 结果: "SGVsbG8gV29ybGQ="
// Base64 解码
byte[] decoded = Base64.getDecoder().decode(encoded);
String result = new String(decoded);
// 结果: "Hello World"
- JWT (JSON Web Token) 令牌
// 签发 JWT
String token = Jwts.builder()
.subject("109")
.claim("userId", 109)
.claim("nameId", 5)
.issuedAt(new Date())
.expiration(new Date(now.getTime() + 86400000))
.signWith(secretKey) // 签名
.compact();
// 结果: "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMDkiLCJ1c2VySWQiOjEwOX0.abc123..."
// 验证 JWT
Claims claims = Jwts.parser()
.verifyWith(secretKey)
.build()
.parseSignedClaims(token)
.getPayload();
结构
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMDkifQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
│ │ │
├─ Header (头部) ├─ Payload (载荷) └─ Signature (签名)
Base64编码 Base64编码 HMAC-SHA256签名
Header.Payload.signature
有密钥
用户信息能被解密被看到,但是带的signature起到签名作用,不能被伪造信息
3. AES 对称加密算法
需要密钥才能解密,适合密码、身份证号敏感数据
数据长,传输较不易
// AES 加密
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, gcmParameterSpec);
byte[] ciphertext = cipher.doFinal(plaintext);
// AES 解密
cipher.init(Cipher.DECRYPT_MODE, secretKey, gcmParameterSpec);
byte[] plaintext = cipher.doFinal(ciphertext);


浙公网安备 33010602011771号