SpringBoot | 加密算法使用示例

欢迎参观我的博客,一个Vue 与 SpringBoot结合的产物:https://poetize.cn

原文链接: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("解密异常!");
        }
    }
}
posted @ 2023-09-27 09:47  LittleDonkey  阅读(165)  评论(0编辑  收藏  举报