SpringBoot | 加密算法使用示例
欢迎参观我的博客,一个Vue 与 SpringBoot结合的产物:https://poetize.cn
- 博客:https://gitee.com/littledokey/poetize-vue2.git
- 聊天室:https://gitee.com/littledokey/poetize-im-vue3.git
- 后端:https://gitee.com/littledokey/poetize.git
- 七牛云登录/注册地址(文件服务器,CDN):https://s.qiniu.com/Mz6Z32
原文链接:https://poetize.cn/article?id=41
MD5加密
private static String md5(String input) {
if (input == null || input.length() == 0) {
return input;
}
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(input.getBytes(StandardCharsets.UTF_8));
byte[] byteArray = md5.digest();
StringBuilder sb = new StringBuilder();
for (byte b : byteArray) {
sb.append(String.format("%02x", b));
}
return sb.toString();
} catch (Exception e) {
return input;
}
}
MD5加密特点
- 针对不同长度待加密的数据、字符串等等,其都可以返回一个固定长度的MD5加密字符串(通常是32位的16进制字符串)
- 其加密过程几乎不可逆,除非维护一个庞大的Key-Value数据库来进行碰撞破解,否则几乎无法解开
- 运算简便,且可实现方式多样,通过一定的处理方式也可以避免碰撞算法的破解(加盐:随机字符串)
- 对于一个固定的字符串,数字等等,MD5加密后的字符串是固定的,也就是说不管MD5加密多少次,都是同样的结果
AES对称加密
@Slf4j
public class AesUtils {
/**
* 算法
*
* AES/CBC/PKCS5Padding:表示使用AES算法进行加密,采用CBC模式来处理数据块之间的链接,同时使用PKCS5Padding进行数据填充,以确保数据可以有效地被块加密。
*/
private static final String ALGORITHMSTR = "AES/CBC/PKCS5Padding";
/**
* 密钥 (需要前端和后端保持一致)十六位作为密钥
*/
private static final String key = "";
/**
* 密钥偏移量 (需要前端和后端保持一致)十六位作为密钥偏移量
*/
private static final String iv = "";
/**
* @param decrypt 待加密的字符串
* @name: encrypt
* @description: 将字符串进行AES加密
* @return: java.lang.String 加密后的string
*/
public static String encrypt(String decrypt) {
try {
//算法/模式/补码方式
Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
//使用CBC模式,需要一个向量iv,可增加加密算法的强度
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8));
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key.getBytes(), "AES"), ivParameterSpec);
byte[] encrypted = cipher.doFinal(decrypt.getBytes());
//此处使用BASE64做转码功能,同时能起到2次加密的作用
return new BASE64Encoder().encodeBuffer(encrypted);
} catch (Exception e) {
log.info("加密异常 decrypt = {}, {}", decrypt, e.getMessage());
throw new Exception("加密异常!");
}
}
/**
* @param encrypt 待解密的base 64 code
* @name: decrypt
* @description: 将base 64 code AES解密
* @return: java.lang.String 解密后的string
*/
public static String decrypt(String encrypt) {
try {
byte[] encrypted = new BASE64Decoder().decodeBuffer(encrypt);
Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8));
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key.getBytes(), "AES"), ivParameterSpec);
byte[] decryptBytes = cipher.doFinal(encrypted);
return new String(decryptBytes);
} catch (Exception e) {
log.info("加密异常 encrypt = {}, {}", encrypt, e.getMessage());
throw new Exception("解密异常!");
}
}
}