zoukankan      html  css  js  c++  java
  • 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);
        }
    }
  • 相关阅读:
    PAT (Advanced Level) 1086. Tree Traversals Again (25)
    PAT (Advanced Level) 1085. Perfect Sequence (25)
    PAT (Advanced Level) 1084. Broken Keyboard (20)
    PAT (Advanced Level) 1083. List Grades (25)
    PAT (Advanced Level) 1082. Read Number in Chinese (25)
    HDU 4513 吉哥系列故事――完美队形II
    POJ Oulipo KMP 模板题
    POJ 3376 Finding Palindromes
    扩展KMP
    HDU 2289 Cup
  • 原文地址:https://www.cnblogs.com/jun1019/p/15203867.html
Copyright © 2011-2022 走看看