• 前后端通信进行AES加密(Vue


    一. 前端工作
    
    1. 安装crypto-js
    
    安装命令:npm install crypto-js
    
    2. js编写
    
    import CryptoJS from "crypto-js";
     
    const CRYPTOJSKEY= "abcdefgabcdefg12";
    // 加密
    const encrypt = (plaintText)=> {
        var plaintText = plaintText;
        var options = {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7
        };
        var key = CryptoJS.enc.Utf8.parse(CRYPTOJSKEY);
        var encryptedData = CryptoJS.AES.encrypt(plaintText, key, options);
        var encryptedBase64Str = encryptedData.toString();
        // encryptedBase64Str = encryptedBase64Str;
        return encryptedBase64Str;
    };
    //解密
    const decrypt = (encryptedBase64Str) => {
        var vals = encryptedBase64Str;
        var options = {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7
        };
        var key = CryptoJS.enc.Utf8.parse(CRYPTOJSKEY);
        var decryptedData = CryptoJS.AES.decrypt(vals, key, options);
        var decryptedStr = CryptoJS.enc.Utf8.stringify(decryptedData);
        return decryptedStr
    };
    export default{
        encrypt,
        decrypt,
    }
    
    二. 后端工作
    
    1. 编写加密工具类
    
    package com.visionvera.common.utils;
     
    import java.math.BigInteger;
     
    import javax.crypto.Cipher;
    import javax.crypto.KeyGenerator;
    import javax.crypto.spec.SecretKeySpec;
     
    import org.apache.commons.codec.binary.Base64;
    import org.apache.commons.lang3.StringUtils;
     
    import sun.misc.BASE64Decoder;
     
    /**
     * AES的加密和解密
     *
     * @author jlm
     */
    public class AESUtil {
     
        //密钥 (需要前端和后端保持一致)
        private static String KEY = "abcdefgabcdefg12";
        //算法
        private static final String ALGORITHMSTR = "AES/ECB/PKCS5Padding";
     
        /**
         * aes解密
         *
         * @param encrypt 内容
         * @return
         * @throws Exception
         */
        public static String aesDecrypt(String encrypt) {
            try {
                return aesDecrypt(encrypt, KEY);
            } catch (Exception e) {
                e.printStackTrace();
                return "";
            }
        }
     
        /**
         * aes加密
         *
         * @param content
         * @return
         * @throws Exception
         */
        public static String aesEncrypt(String content) {
            try {
                return aesEncrypt(content, KEY);
            } catch (Exception e) {
                e.printStackTrace();
                return "";
            }
        }
     
        /**
         * 将byte[]转为各种进制的字符串
         *
         * @param bytes byte[]
         * @param radix 可以转换进制的范围,从Character.MIN_RADIX到Character.MAX_RADIX,超出范围后变为10进制
         * @return 转换后的字符串
         */
        public static String binary(byte[] bytes, int radix) {
            return new BigInteger(1, bytes).toString(radix);// 这里的1代表正数
        }
     
        /**
         * base 64 encode
         *
         * @param bytes 待编码的byte[]
         * @return 编码后的base 64 code
         */
        public static String base64Encode(byte[] bytes) {
            return Base64.encodeBase64String(bytes);
        }
     
        /**
         * base 64 decode
         *
         * @param base64Code 待解码的base 64 code
         * @return 解码后的byte[]
         * @throws Exception
         */
        public static byte[] base64Decode(String base64Code) throws Exception {
            return StringUtils.isEmpty(base64Code) ? null : new BASE64Decoder().decodeBuffer(base64Code);
        }
     
     
        /**
         * AES加密
         *
         * @param content    待加密的内容
         * @param encryptKey 加密密钥
         * @return 加密后的byte[]
         * @throws Exception
         */
        public static byte[] aesEncryptToBytes(String content, String encryptKey) throws Exception {
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            kgen.init(128);
            Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
            cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), "AES"));
     
            return cipher.doFinal(content.getBytes("utf-8"));
        }
     
     
        /**
         * AES加密为base 64 code
         *
         * @param content    待加密的内容
         * @param encryptKey 加密密钥
         * @return 加密后的base 64 code
         * @throws Exception
         */
        public static String aesEncrypt(String content, String encryptKey) throws Exception {
            return base64Encode(aesEncryptToBytes(content, encryptKey));
        }
     
        /**
         * AES解密
         *
         * @param encryptBytes 待解密的byte[]
         * @param decryptKey   解密密钥
         * @return 解密后的String
         * @throws Exception
         */
        public static String aesDecryptByBytes(byte[] encryptBytes, String decryptKey) throws Exception {
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            kgen.init(128);
     
            Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
            cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), "AES"));
            byte[] decryptBytes = cipher.doFinal(encryptBytes);
            return new String(decryptBytes);
        }
     
     
        /**
         * 将base 64 code AES解密
         *
         * @param encryptStr 待解密的base 64 code
         * @param decryptKey 解密密钥
         * @return 解密后的string
         * @throws Exception
         */
        public static String aesDecrypt(String encryptStr, String decryptKey) throws Exception {
            return StringUtils.isEmpty(encryptStr) ? null : aesDecryptByBytes(base64Decode(encryptStr), decryptKey);
        }
     
        /**
         * 测试
         */
        public static void main(String[] args) throws Exception {
            String content = "123";
            System.out.println("加密前:" + content);
            System.out.println("加密密钥和解密密钥:" + KEY);
            String encrypt = aesEncrypt(content, KEY);
            System.out.println("加密后:" + encrypt);
            String decrypt = aesDecrypt("Sy93OjPDF5vwNrkTfL9AyA==", KEY);
            System.out.println("解密后:" + decrypt);
        }
    注意:秘钥需前后端保持一致,以上代码亲测可用
    
  • 相关阅读:
    学习笔记 js跨域请求
    使用Crate dunce获得绝对路径
    自己实现的组件库
    320 什么是 WXML 模版
    325 笛卡尔积算法
    324 借用构造函数继承
    322 n个台阶 一次只能走 一步或者两步,问有多少种走法
    322 原型链继承
    320 说说 SSR?
    321 实现1物理像素边框
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13317281.html
Copyright © 2020-2023  润新知