AES加密

  • Pom.xml

    <!-- Base64编码  -->
    <dependency>
      <groupId>org.apache.directory.studio</groupId>
      <artifactId>org.apache.commons.codec</artifactId>
      <version>1.8</version>
    </dependency>
    <dependency>
      <groupId>org.bouncycastle</groupId>
      <artifactId>bcprov-jdk16</artifactId>
      <version>1.46</version>
    </dependency>
    
  • 后端处理
    //加密
    String encrypt = AESUtil.encrypt(str);
    //解密
    String decrypt = AESUtil.decrypt(encrypt);

    Ps:遍历集合处理不可用Lambda表达式

    //跳转导致的特殊字符问题
    String str = URLEncoder.encode(“xxx”, “UTF-8”);
    String str = URLDecoder.decode(“xxx”, “UTF-8”).replace(’ ', ‘+’);

  • 前端处理
    encodeURIComponent(str);
    Ps:前端传给后端特殊字符加号会变成空格

  • 加密方法

    import org.apache.tomcat.util.codec.binary.Base64;
    import org.bouncycastle.jce.provider.BouncyCastleProvider;
    
    import javax.crypto.Cipher;
    import javax.crypto.spec.SecretKeySpec;
    import java.nio.charset.StandardCharsets;
    import java.security.SecureRandom;
    import java.util.Random;
    
    /**
     * AES加、解密算法工具类
     */
    public class AESUtil {
    
        /**
         * 密钥
         */
        private static final String FINAL_KEY = "JJ1EMG2yW0vy1yO6";
    
        /**
         * 加密算法AES
         */
        private static final String KEY_ALGORITHM = "AES";
    
        /**
         * key的长度,Wrong key size: must be equal to 128, 192 or 256
         * 传入时需要16、24、36
         */
        private static final Integer KEY_LENGTH = 16 * 8;
    
        /**
         * 算法名称/加密模式/数据填充方式
         * 默认:AES/ECB/PKCS5Padding
         */
        private static final String ALGORITHMS = "AES/ECB/PKCS5Padding";
    
        /**
         * 后端AES的key,由静态代码块赋值
         */
        public static String key;
    
        static {
            key = getKey();
        }
    
        /**
         * 获取key
         */
        public static String getKey() {
            StringBuilder uid = new StringBuilder();
            //产生16位的强随机数
            Random rd = new SecureRandom();
            for (int i = 0; i < KEY_LENGTH / 8; i++) {
                //产生0-2的3位随机数
                int type = rd.nextInt(3);
                switch (type) {
                    case 0:
                        //0-9的随机数
                        uid.append(rd.nextInt(10));
                        break;
                    case 1:
                        //ASCII在65-90之间为大写,获取大写随机
                        uid.append((char) (rd.nextInt(25) + 65));
                        break;
                    case 2:
                        //ASCII在97-122之间为小写,获取小写随机
                        uid.append((char) (rd.nextInt(25) + 97));
                        break;
                    default:
                        break;
                }
            }
            return uid.toString();
        }
    
        /**
         * 加密
         *
         * @param content 加密的字符串
         */
        public static String encrypt(String content) throws Exception {
            //设置Cipher对象
            Cipher cipher = Cipher.getInstance(ALGORITHMS, new BouncyCastleProvider());
            cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(FINAL_KEY.getBytes(), KEY_ALGORITHM));
    
            //调用doFinal
            byte[] b = cipher.doFinal(content.getBytes(StandardCharsets.UTF_8));
    
            // 转base64
            return Base64.encodeBase64String(b);
    
        }
    
        /**
         * 解密
         *
         * @param encryptStr 解密的字符串
         */
        public static String decrypt(String encryptStr) throws Exception {
            //base64格式的key字符串转byte
            byte[] decodeBase64 = Base64.decodeBase64(encryptStr);
    
            //设置Cipher对象
            Cipher cipher = Cipher.getInstance(ALGORITHMS, new BouncyCastleProvider());
            cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(FINAL_KEY.getBytes(), KEY_ALGORITHM));
    
            //调用doFinal解密
            byte[] decryptBytes = cipher.doFinal(decodeBase64);
            return new String(decryptBytes);
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值