接口获取key然后对数据进行加解密
1.通过接口获取加密需要用到的key
public static SecretKey generateKey() throws Exception {
//KEY_ALGORITHM-> "AES"
//KEY_SIZE-> 可以是128, 192, 或 256位密钥长度
KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM);
keyGenerator.init(KEY_SIZE);
return keyGenerator.generateKey();
}
可以通过编写一个controller去调用这个方法获取到加密所需要的key
2.获取到key的内容
2.1 接口内容
@GetMapping("/generateKey")
public AjaxResult generateKey() {
try {
SecretKey secretKey = AESUtil.generateKey();
return AjaxResult.success(secretKey);
} catch (Exception e) {
throw new ServiceException("密钥获取失败请稍后重试!");
}
}
2.2 返回结果
{
"msg": "操作成功",
"code": 200,
"data": {
"algorithm": "AES",
"encoded": "OKeHNhJ4iZ7D4uGGJKmrAw==",
"format": "RAW",
"destroyed": false
}
}
获取到加密所需的key(data里面的encoded字段值)对需要加密的字段进行数据加密
2.3 数据加密
前端加密部分不做演示,只做后端加密解密方式
/**
* 根据生成的密钥加密数据
* @param plainText 需要加密的文本数据
* @param key 加密时使用的密钥
* @return 加密后的文本数据
* @throws Exception
* KEY_ALGORITHM AES
*/
public static String encrypt(String plainText, String key) throws Exception {
SecretKey secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), KEY_ALGORITHM);
Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(encryptedBytes);
}
2.4 数据解密
/**
* 解密
* @param encryptedText 需要解密的文本数据
* @param key 加密时使用的密钥
* @return 解密后的文本数据
* @throws Exception
* KEY_ALGORITHM AES
*/
public static String decrypt(String encryptedText, String key) throws Exception {
SecretKey secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), KEY_ALGORITHM);
Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decodedBytes = Base64.getDecoder().decode(encryptedText);
byte[] decryptedBytes = cipher.doFinal(decodedBytes);
return new String(decryptedBytes, StandardCharsets.UTF_8);
}
至此工具类功能基本完成只需要在业务代码里添加需要加密解密的逻辑即可
3. 业务使用
//例如登录需要对用户名密码进行加解密操作
//前端通过获取到的key对用户名密码解密
//后端使用前端传入的key进行解密操作
try {
loginBody.setUsername(AESUtil.decrypt(loginBody.getUsername(),loginBody.getKey()));
loginBody.setPassword(AESUtil.decrypt(loginBody.getPassword(),loginBody.getKey()));
} catch (Exception e) {
throw new ServiceException("用户名/密码解密失败!");
}