• Java服务端API接口统一加密和解密


    package com.ubest.scf.base.encrypt;
    
    import org.apache.commons.codec.binary.Base64;
    
    import javax.crypto.Cipher;
    import javax.crypto.KeyGenerator;
    import javax.crypto.spec.SecretKeySpec;
    
    /**
     * 前后端数据传输加密工具类
     *
     * @author monkey
     */
    public class AesEncryptUtils {
        //参数分别代表 算法名称/加密模式/数据填充方式
        private static final String ALGORITHMSTR = "AES/ECB/PKCS5Padding";
    
        /**
         * 加密
         *
         * @param content    加密的字符串
         * @param encryptKey key值
         * @return
         * @throws Exception
         */
    
        public static String encrypt(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"));
            byte[] b = cipher.doFinal(content.getBytes("utf-8"));
            // 采用base64算法进行转码,避免出现中文乱码
            return Base64.encodeBase64String(b);
        }
    
        /**
         * 解密
         *
         * @param encryptStr 解密的字符串
         * @param decryptKey 解密的key值
         * @return
         * @throws Exception
         */
        public static String decrypt(String encryptStr, 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"));
    
            // 采用base64算法进行转码,避免出现中文乱码
            byte[] encryptBytes = Base64.decodeBase64(encryptStr);
            byte[] decryptBytes = cipher.doFinal(encryptBytes);
            return new String(decryptBytes);
        }
    }
    
    
    
    
    package com.ubest.scf.base.encrypt;
    
    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.NoSuchPaddingException;
    import javax.crypto.spec.SecretKeySpec;
    
    /**
     * AES
     */
    public class AESUtils {
        private static final String AES_ALGORITHM = "AES/ECB/PKCS5Padding";
    
        // 获取 cipher
        private static Cipher getCipher(byte[] key, int model) throws Exception {
            SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
            Cipher cipher = Cipher.getInstance(AES_ALGORITHM);
            cipher.init(model, secretKeySpec);
            return cipher;
        }
    
        // AES加密
        public static byte[] encrypt(byte[] data, byte[] key)
                throws Exception, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {
            Cipher cipher = getCipher(key, Cipher.ENCRYPT_MODE);
            return cipher.doFinal(data);
        }
    
        // AES解密
        public static byte[] decrypt(byte[] data, byte[] key) throws Exception, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {
            Cipher cipher = getCipher(key, Cipher.DECRYPT_MODE);
            return cipher.doFinal(data);
        }
    }
    
    
    
    
    package com.ubest.scf.base.encrypt;
    
    import org.apache.commons.codec.binary.Base64;
    
    import javax.crypto.Cipher;
    import java.io.ByteArrayOutputStream;
    import java.security.*;
    import java.security.interfaces.RSAPrivateKey;
    import java.security.interfaces.RSAPublicKey;
    import java.security.spec.PKCS8EncodedKeySpec;
    import java.security.spec.X509EncodedKeySpec;
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * <p>
     * RSA公钥/私钥/签名工具包
     * </p>
     * <p>
     * 罗纳德·李维斯特(Ron [R]ivest)、阿迪·萨莫尔(Adi [S]hamir)和伦纳德·阿德曼(Leonard [A]dleman)
     * </p>
     * <p>
     * 字符串格式的密钥在未在特殊说明情况下都为BASE64编码格式<br/>
     * 由于非对称加密速度极其缓慢,一般文件不使用它来加密而是使用对称加密,<br/>
     * 非对称加密算法可以用来对对称加密的密钥加密,这样保证密钥的安全也就保证了数据的安全
     * </p>
     *
     * @author monkey
     * @date 2018-10-29
     */
    public class RSAUtils {
        /**
         * 加密算法RSA
         */
        public static final String KEY_ALGORITHM = "RSA";
    
        /**
         * 签名算法
         */
        public static final String SIGNATURE_ALGORITHM = "MD5withRSA";
    
        /**
         * 获取公钥的key
         */
        private static final String PUBLIC_KEY = "RSAPublicKey";
    
        /**
         * 获取私钥的key
         */
        private static final String PRIVATE_KEY = "RSAPrivateKey";
    
        /**
         * RSA最大加密明文大小
         */
        private static final int MAX_ENCRYPT_BLOCK = 117;
    
        /**
         * RSA最大解密密文大小
         */
        private static final int MAX_DECRYPT_BLOCK = 128;
    
        /**
         * RSA 位数 如果采用2048 上面最大加密和最大解密则须填写: 245 256
         */
        private static final int INITIALIZE_LENGTH = 1024;
    
        /**
         * <p>
         * 生成密钥对(公钥和私钥)
         * </p>
         *
         * @return
         * @throws Exception
         */
        public static Map<String, Object> genKeyPair() throws Exception {
            KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
            keyPairGen.initialize(INITIALIZE_LENGTH);
            KeyPair keyPair = keyPairGen.generateKeyPair();
            RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
            RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
            Map<String, Object> keyMap = new HashMap<String, Object>(2);
            keyMap.put(PUBLIC_KEY, publicKey);
            keyMap.put(PRIVATE_KEY, privateKey);
            return keyMap;
        }
    
        /**
         * <p>
         * 用私钥对信息生成数字签名
         * </p>
         *
         * @param data       已加密数据
         * @param privateKey 私钥(BASE64编码)
         * @return
         * @throws Exception
         */
        public static String sign(byte[] data, String privateKey) throws Exception {
            byte[] keyBytes = Base64.decodeBase64(privateKey);
            PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
            PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec);
            Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
            signature.initSign(privateK);
            signature.update(data);
            return Base64.encodeBase64String(signature.sign());
        }
    
        /**
         * <p>
         * 校验数字签名
         * </p>
         *
         * @param data      已加密数据
         * @param publicKey 公钥(BASE64编码)
         * @param sign      数字签名
         * @return
         * @throws Exception
         */
        public static boolean verify(byte[] data, String publicKey, String sign) throws Exception {
            byte[] keyBytes = Base64.decodeBase64(publicKey);
            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
            PublicKey publicK = keyFactory.generatePublic(keySpec);
            Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
            signature.initVerify(publicK);
            signature.update(data);
            return signature.verify(Base64.decodeBase64(sign));
        }
    
        /**
         * <P>
         * 私钥解密
         * </p>
         *
         * @param encryptedData 已加密数据
         * @param privateKey    私钥(BASE64编码)
         * @return
         * @throws Exception
         */
        public static byte[] decryptByPrivateKey(byte[] encryptedData, String privateKey) throws Exception {
            byte[] keyBytes = Base64.decodeBase64(privateKey);
            PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
            Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);
            Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
            cipher.init(Cipher.DECRYPT_MODE, privateK);
            int inputLen = encryptedData.length;
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            int offSet = 0;
            byte[] cache;
            int i = 0;
    
            // 对数据分段解密
            while (inputLen - offSet > 0) {
                if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
                    cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);
                } else {
                    cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
                }
                out.write(cache, 0, cache.length);
                i++;
                offSet = i * MAX_DECRYPT_BLOCK;
            }
            byte[] decryptedData = out.toByteArray();
            out.close();
            return decryptedData;
        }
    
        /**
         * <p>
         * 公钥解密
         * </p>
         *
         * @param encryptedData 已加密数据
         * @param publicKey     公钥(BASE64编码)
         * @return
         * @throws Exception
         */
        public static byte[] decryptByPublicKey(byte[] encryptedData, String publicKey) throws Exception {
            byte[] keyBytes = Base64.decodeBase64(publicKey);
            X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
            Key publicK = keyFactory.generatePublic(x509KeySpec);
            Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
            cipher.init(Cipher.DECRYPT_MODE, publicK);
            int inputLen = encryptedData.length;
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            int offSet = 0;
            byte[] cache;
            int i = 0;
    
            // 对数据分段解密
            while (inputLen - offSet > 0) {
                if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
                    cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);
                } else {
                    cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
                }
                out.write(cache, 0, cache.length);
                i++;
                offSet = i * MAX_DECRYPT_BLOCK;
            }
            byte[] decryptedData = out.toByteArray();
            out.close();
            return decryptedData;
        }
    
        /**
         * <p>
         * 公钥加密
         * </p>
         *
         * @param data      源数据
         * @param publicKey 公钥(BASE64编码)
         * @return
         * @throws Exception
         */
        public static byte[] encryptByPublicKey(byte[] data, String publicKey) throws Exception {
            byte[] keyBytes = Base64.decodeBase64(publicKey);
            X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
            Key publicK = keyFactory.generatePublic(x509KeySpec);
    
            // 对数据加密
            Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
            cipher.init(Cipher.ENCRYPT_MODE, publicK);
            int inputLen = data.length;
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            int offSet = 0;
            byte[] cache;
            int i = 0;
    
            // 对数据分段加密
            while (inputLen - offSet > 0) {
                if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
                    cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);
                } else {
                    cache = cipher.doFinal(data, offSet, inputLen - offSet);
                }
                out.write(cache, 0, cache.length);
                i++;
                offSet = i * MAX_ENCRYPT_BLOCK;
            }
            byte[] encryptedData = out.toByteArray();
            out.close();
            return encryptedData;
        }
    
        /**
         * <p>
         * 私钥加密
         * </p>
         *
         * @param data       源数据
         * @param privateKey 私钥(BASE64编码)
         * @return
         * @throws Exception
         */
        public static byte[] encryptByPrivateKey(byte[] data, String privateKey) throws Exception {
            byte[] keyBytes = Base64.decodeBase64(privateKey);
            PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
            Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);
            Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
            cipher.init(Cipher.ENCRYPT_MODE, privateK);
            int inputLen = data.length;
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            int offSet = 0;
            byte[] cache;
            int i = 0;
    
            // 对数据分段加密
            while (inputLen - offSet > 0) {
                if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
                    cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);
                } else {
                    cache = cipher.doFinal(data, offSet, inputLen - offSet);
                }
                out.write(cache, 0, cache.length);
                i++;
                offSet = i * MAX_ENCRYPT_BLOCK;
            }
            byte[] encryptedData = out.toByteArray();
            out.close();
            return encryptedData;
        }
    
        /**
         * <p>
         * 获取私钥
         * </p>
         *
         * @param keyMap 密钥对
         * @return
         * @throws Exception
         */
        public static String getPrivateKey(Map<String, Object> keyMap) throws Exception {
            Key key = (Key) keyMap.get(PRIVATE_KEY);
            return Base64.encodeBase64String(key.getEncoded());
        }
    
        /**
         * <p>
         * 获取公钥
         * </p>
         *
         * @param keyMap 密钥对
         * @return
         * @throws Exception
         */
        public static String getPublicKey(Map<String, Object> keyMap) throws Exception {
            Key key = (Key) keyMap.get(PUBLIC_KEY);
            return Base64.encodeBase64String(key.getEncoded());
        }
    
        /**
         * java端公钥加密
         */
        public static String encryptedDataOnJava(String data, String PUBLICKEY) {
            try {
                data = Base64.encodeBase64String(encryptByPublicKey(data.getBytes(), PUBLICKEY));
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return data;
        }
    
        /**
         * java端私钥解密
         */
        public static String decryptDataOnJava(String data, String PRIVATEKEY) {
            String temp = "";
            try {
                byte[] rs = Base64.decodeBase64(data);
                temp = new String(RSAUtils.decryptByPrivateKey(rs, PRIVATEKEY), "UTF-8");
            } catch (Exception e) {
                e.printStackTrace();
            }
            return temp;
        }
    }
    
    
    
    
    
    package com.ubest.scf.base.encrypt;
    
    import org.springframework.web.bind.annotation.Mapping;
    
    import java.lang.annotation.*;
    
    /**
     * @author monkey
     * @desc 请求数据解密
     * @date 2018/10/25 20:17
     */
    @Target({ElementType.METHOD, ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Mapping
    @Documented
    public @interface SecurityParameter {
        /**
         * 入参是否解密,默认解密
         */
        boolean inDecode() default true;
    
        /**
         * 出参是否加密,默认加密
         */
        boolean outEncode() default true;
    }
    
    
    
    
    
    package com.ubest.scf.base.encrypt;
    
    import com.google.gson.Gson;
    import com.google.gson.reflect.TypeToken;
    import org.apache.commons.io.IOUtils;
    import org.apache.commons.lang3.StringUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.core.MethodParameter;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpInputMessage;
    import org.springframework.http.converter.HttpMessageConverter;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.lang.reflect.Type;
    import java.util.Map;
    
    
    /**
     * @author monkey
     * @desc 请求数据解密
     * @date 2018/10/29 20:17
     */
    @ControllerAdvice(basePackages = "com.ubest.scf.linking.controller")
    public class DecodeRequestBodyAdvice implements RequestBodyAdvice {
        private static final Logger logger = LoggerFactory.getLogger(DecodeRequestBodyAdvice.class);
    
        //    @Value("${server.private.key}")
    //    private String SERVER_PRIVATE_KEY;
        private static final String SERVER_PRIVATE_KEY = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBALzkv8+Ccy40gcjiWmWtkFBGJVK/RTjuTmuSRZ7QV0tJK4zZFtjdihKQXujtC++hwph/sOaIad5Lc6ptnb7yPhFjQAvU8X4ZEEzo/RL4FLTLJA3V4GCfpsYwmxPK1EKKOExT8ywc7hTT+M98VUB4ieGK3SRahXeO7YK6yf8nFuqvAgMBAAECgYEArtQFV9lEI8LDUJt30V3oEPQrfT+8oOmnuVZji48HDI5HeZA/3i6FqZLn1Sv4/Sy5gA3HPEeLvQwWnOnhs6ZfnHxRwlXpxvb6b0dhb2mNpQ7iGs6RuhlqXfIIpRurUzHBjLlVIm8PkApRmjfWeKoocAcF3GUEl1WLGW3CKNizPzkCQQD3oO+Jy+nqWwqGphwgjamfUM3DqVrEC6NWysehXE7GyDpC6Iih/W20xWW6isNbxd0NHFQjct/LFuO4mzEFKjXLAkEAw0d/5cm1YsLsjsuBJFf+5ERIo9ogvdQoOu+7GGL10ppab2ctXrsF6etLxNF/LGs+Zv85QAL4sPvYe7ZmzcOiLQJBAOJvb5r5s/RxO7bUvnOmFq1wHjgE7NLIMZxz4QhUeFSdU2lLaWV3cJIUz2k86ldJH1GVzfp8WNhFHgb5ImIurvECQDvGfir7xI83tau8NYrHeNms4UNuuMkC0VHBIldDq5XM89PYFHZD73p8MRRNQI17Qn3KsF6cyj16yfiMjAl+Uf0CQQDtIPuNxGLKQ1c1HFDiuVUrkG0N3LSTxI66m+rCCFsZBC3d6loR1IB03WRhFExcbEuWuU98wg07RXzy03SyOWgz";
    
        @Override
        public boolean supports(MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) {
            return true;
        }
    
        @Override
        public Object handleEmptyBody(Object body, HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) {
            return body;
        }
    
        @Override
        public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) throws IOException {
            try {
                boolean encode = false;
                if (methodParameter.getMethod().isAnnotationPresent(SecurityParameter.class)) {
                    //获取注解配置的包含和去除字段
                    SecurityParameter serializedField = methodParameter.getMethodAnnotation(SecurityParameter.class);
                    //入参是否需要解密
                    encode = serializedField.inDecode();
                }
    
                if (encode) {
                    logger.info("对方法method :【" + methodParameter.getMethod().getName() + "】返回数据进行解密");
                    return new MyHttpInputMessage(inputMessage);
                } else {
                    return inputMessage;
                }
            } catch (Exception e) {
                e.printStackTrace();
                logger.error("对方法method :【" + methodParameter.getMethod().getName() + "】返回数据进行解密出现异常:" + e.getMessage());
                return inputMessage;
            }
        }
    
    
        @Override
    
        public Object afterBodyRead(Object body, HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) {
            return body;
        }
    
    
        class MyHttpInputMessage implements HttpInputMessage {
            private HttpHeaders headers;
            private InputStream body;
    
            public MyHttpInputMessage(HttpInputMessage inputMessage) throws Exception {
                this.headers = inputMessage.getHeaders();
                this.body = IOUtils.toInputStream(easpString(IOUtils.toString(inputMessage.getBody(), "utf-8")));
            }
    
            @Override
            public InputStream getBody() throws IOException {
                return body;
            }
    
            @Override
    
            public HttpHeaders getHeaders() {
                return headers;
            }
    
            /**
             * @param requestData
             * @return
             */
            public String easpString(String requestData) {
                if (requestData != null && !requestData.equals("")) {
                    Map<String, String> map = new Gson().fromJson(requestData, new TypeToken<Map<String, String>>() {
                    }.getType());
                    // 密文
                    String data = map.get("requestData");
                    // 加密的ase秘钥
                    String encrypted = map.get("encrypted");
                    if (StringUtils.isEmpty(data) || StringUtils.isEmpty(encrypted)) {
                        throw new RuntimeException("参数【requestData】缺失异常!");
                    } else {
                        String content = null;
                        String aseKey = null;
                        try {
                            aseKey = RSAUtils.decryptDataOnJava(encrypted, SERVER_PRIVATE_KEY);
                        } catch (Exception e) {
                            throw new RuntimeException("参数【aseKey】解析异常!");
                        }
                        try {
                            content = AesEncryptUtils.decrypt(data, aseKey);
                        } catch (Exception e) {
                            throw new RuntimeException("参数【content】解析异常!");
                        }
                        if (StringUtils.isEmpty(content) || StringUtils.isEmpty(aseKey)) {
                            throw new RuntimeException("参数【requestData】解析参数空指针异常!");
                        }
                        return content;
                    }
                }
                throw new RuntimeException("参数【requestData】不合法异常!");
            }
        }
    }
    
    
    
    
    
    
    package com.ubest.scf.base.encrypt;
    
    import com.fasterxml.jackson.databind.ObjectMapper;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.core.MethodParameter;
    import org.springframework.http.MediaType;
    import org.springframework.http.server.ServerHttpRequest;
    import org.springframework.http.server.ServerHttpResponse;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Random;
    
    /**
     * @author monkey
     * @desc 返回数据加密
     * @date 2018/10/25 20:17
     */
    @ControllerAdvice(basePackages = "com.ubest.scf.linking.controller")
    public class EncodeResponseBodyAdvice implements ResponseBodyAdvice {
        private final static Logger logger = LoggerFactory.getLogger(EncodeResponseBodyAdvice.class);
    
        //    @Value("${client.public.key}")
    //    private String CLIENT_PUBLIC_KEY;
        private static final String CLIENT_PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC85L/PgnMuNIHI4lplrZBQRiVSv0U47k5rkkWe0FdLSSuM2RbY3YoSkF7o7QvvocKYf7DmiGneS3OqbZ2+8j4RY0AL1PF+GRBM6P0S+BS0yyQN1eBgn6bGMJsTytRCijhMU/MsHO4U0/jPfFVAeInhit0kWoV3ju2Cusn/JxbqrwIDAQAB";
    
        @Override
        public boolean supports(MethodParameter methodParameter, Class aClass) {
            return true;
        }
    
        @Override
        public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
            boolean encode = false;
            if (methodParameter.getMethod().isAnnotationPresent(SecurityParameter.class)) {
                //获取注解配置的包含和去除字段
                SecurityParameter serializedField = methodParameter.getMethodAnnotation(SecurityParameter.class);
                //出参是否需要加密
                encode = serializedField.outEncode();
            }
            if (encode) {
                logger.info("对方法method :【" + methodParameter.getMethod().getName() + "】返回数据进行加密");
                ObjectMapper objectMapper = new ObjectMapper();
                try {
                    String result = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(body);
                    // 生成aes秘钥
                    String aseKey = getRandomString(16);
                    // rsa加密
                    String encrypted = RSAUtils.encryptedDataOnJava(aseKey, CLIENT_PUBLIC_KEY);
                    // aes加密
                    String requestData = AesEncryptUtils.encrypt(result, aseKey);
                    Map<String, String> map = new HashMap<>();
                    map.put("encrypted", encrypted);
                    map.put("requestData", requestData);
                    return map;
                } catch (Exception e) {
                    e.printStackTrace();
                    logger.error("对方法method :【" + methodParameter.getMethod().getName() + "】返回数据进行解密出现异常:" + e.getMessage());
                }
            }
            return body;
        }
    
        /**
         * 创建指定位数的随机字符串
         *
         * @param length 表示生成字符串的长度
         * @return 字符串
         */
        public static String getRandomString(int length) {
            String base = "abcdefghijklmnopqrstuvwxyz0123456789";
            Random random = new Random();
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < length; i++) {
                int number = random.nextInt(base.length());
                sb.append(base.charAt(number));
            }
            return sb.toString();
        }
    }
    package com.ubest.scf.linking.service;
    
    import com.alibaba.fastjson.JSON;
    import com.ubest.scf.base.encrypt.AesEncryptUtils;
    import com.ubest.scf.base.encrypt.RSAUtils;
    import lombok.extern.slf4j.Slf4j;
    import org.junit.runner.RunWith;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import java.util.HashMap;
    import java.util.Map;
    
    @Slf4j
    @SpringBootTest
    @RunWith(SpringRunner.class)
    public class TestLinkUtil {
        private static final String PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC85L/PgnMuNIHI4lplrZBQRiVSv0U47k5rkkWe0FdLSSuM2RbY3YoSkF7o7QvvocKYf7DmiGneS3OqbZ2+8j4RY0AL1PF+GRBM6P0S+BS0yyQN1eBgn6bGMJsTytRCijhMU/MsHO4U0/jPfFVAeInhit0kWoV3ju2Cusn/JxbqrwIDAQAB";
        private static final String PRIVATE_KEY = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBALzkv8+Ccy40gcjiWmWtkFBGJVK/RTjuTmuSRZ7QV0tJK4zZFtjdihKQXujtC++hwph/sOaIad5Lc6ptnb7yPhFjQAvU8X4ZEEzo/RL4FLTLJA3V4GCfpsYwmxPK1EKKOExT8ywc7hTT+M98VUB4ieGK3SRahXeO7YK6yf8nFuqvAgMBAAECgYEArtQFV9lEI8LDUJt30V3oEPQrfT+8oOmnuVZji48HDI5HeZA/3i6FqZLn1Sv4/Sy5gA3HPEeLvQwWnOnhs6ZfnHxRwlXpxvb6b0dhb2mNpQ7iGs6RuhlqXfIIpRurUzHBjLlVIm8PkApRmjfWeKoocAcF3GUEl1WLGW3CKNizPzkCQQD3oO+Jy+nqWwqGphwgjamfUM3DqVrEC6NWysehXE7GyDpC6Iih/W20xWW6isNbxd0NHFQjct/LFuO4mzEFKjXLAkEAw0d/5cm1YsLsjsuBJFf+5ERIo9ogvdQoOu+7GGL10ppab2ctXrsF6etLxNF/LGs+Zv85QAL4sPvYe7ZmzcOiLQJBAOJvb5r5s/RxO7bUvnOmFq1wHjgE7NLIMZxz4QhUeFSdU2lLaWV3cJIUz2k86ldJH1GVzfp8WNhFHgb5ImIurvECQDvGfir7xI83tau8NYrHeNms4UNuuMkC0VHBIldDq5XM89PYFHZD73p8MRRNQI17Qn3KsF6cyj16yfiMjAl+Uf0CQQDtIPuNxGLKQ1c1HFDiuVUrkG0N3LSTxI66m+rCCFsZBC3d6loR1IB03WRhFExcbEuWuU98wg07RXzy03SyOWgz";
    
        public static void main(String[] args) {
    //        try {
    //            Map<String, Object> keyPair = RSAUtils.genKeyPair();
    //            System.out.println(JSON.toJSONString(keyPair));
    //        } catch (Exception e) {
    //            e.printStackTrace();
    //        }
            String result = "{"pageNum":1,"pageSize":10}";
            String aseKey = "x5io9liazcffm55m";
            String encrypted = RSAUtils.encryptedDataOnJava(aseKey, PUBLIC_KEY);
            String requestData = null;
            try {
                requestData = AesEncryptUtils.encrypt(result, aseKey);
            } catch (Exception e) {
                e.printStackTrace();
            }
            Map<String, String> map = new HashMap();
            map.put("encrypted", encrypted);
            map.put("requestData", requestData);
            System.out.println(JSON.toJSONString(map));
            System.out.println("//-----------------------");
            try {
                aseKey = RSAUtils.decryptDataOnJava(encrypted, PRIVATE_KEY);
            } catch (Exception var9) {
                throw new RuntimeException("参数【aseKey】解析异常!");
            }
    
            try {
                requestData = AesEncryptUtils.decrypt(requestData, aseKey);
            } catch (Exception var8) {
                throw new RuntimeException("参数【content】解析异常!");
            }
            System.out.println(aseKey);
            System.out.println(requestData);
        }
    }
  • 相关阅读:
    ROW_NUMBER() OVER函数的基本用法
    oracle 中的next_day函数
    宽带大小与实际网速的关系:
    ora-29280 invalid directory path
    [spring]Attribute "scope" must be declared for element type "bean"
    什么是JDK,JRE,SDK,JVM以及API
    管理的常识: 让管理者发挥绩效的7个基本概念 读书笔记
    lua __index的简写
    lua中设置table={}时需要注意的坑
    摄像机旋转
  • 原文地址:https://www.cnblogs.com/jun1019/p/15203867.html
Copyright © 2020-2023  润新知