文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringBoot如何集成数据传输加密

2023-07-04 22:14

关注

这篇文章主要讲解了“SpringBoot如何集成数据传输加密”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot如何集成数据传输加密”吧!

生成DESKey

生成的DES加密密钥一定是8的整数倍的位数

function getRandomStr() {    let str = ""    let array = [        "0",        "1",        "2",        "3",        "4",        "5",        "6",        "7",        "8",        "9",        "a",        "b",        "c",        "d",        "e",        "f",        "g",        "h",        "i",        "j",        "k",        "l",        "m",        "n",        "o",        "p",        "q",        "r",        "s",        "t",        "u",        "v",        "w",        "x",        "y",        "z",        "A",        "B",        "C",        "D",        "E",        "F",        "G",        "H",        "I",        "J",        "K",        "L",        "M",        "N",        "O",        "P",        "Q",        "R",        "S",        "T",        "U",        "V",        "W",        "X",        "Y",        "Z",    ];    for (let i = 0; i < 8; i++) {        str +=  array[Math.round(Math.random() * (array.length - 1))];    }    return str;}

生成RSA密钥对

RSA密钥对有很多种格式,因为需要和前端算法库互联互通,这里选择的是1024位,Padding方式为PKSC1

    public static Map<String, String> createKeysPKSC1(int keySize) {        // map装载公钥和私钥        Map<String, String> keyPairMap = new HashMap<String, String>();        try {            Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());            SecureRandom random = new SecureRandom();            KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "BC");            generator.initialize(keySize, random);            KeyPair keyPair = generator.generateKeyPair();            RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();            RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();            String publicKeyStr = new String(Base64.encodeBase64(publicKey.getEncoded()));            String privateKeyStr = new String(Base64.encodeBase64(privateKey.getEncoded()));            keyPairMap.put("publicKey", publicKeyStr);            keyPairMap.put("privateKey", privateKeyStr);        } catch (Exception e) {            e.printStackTrace();        }        // 返回map        return keyPairMap;    }

前端DES加密

引入crypto.js第三方库

    function encryptByDES(message, key) {        var keyHex = CryptoJS.enc.Utf8.parse(key);        var encrypted = CryptoJS.DES.encrypt(message, keyHex, {            mode: CryptoJS.mode.ECB,            padding: CryptoJS.pad.Pkcs7        });        return encrypted.toString();    }

前端RSA加密

引入jsencrypt,js第三方库

    function encryptByRSA(data, publicKey) {        var encryptor = new JSEncrypt()        encryptor.setPublicKey(publicKey)        return encryptor.encrypt(data);;    }

后端RSA解密

    public static String decryptPKSC1(String data, String privateKeyStr) {        try {            Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());            Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding", "BC");            RSAPrivateKey privateKey = getPrivateKeyPKSC1(privateKeyStr);            cipher.init(Cipher.DECRYPT_MODE, privateKey);            return new String(rsaSplitCodec(cipher, Cipher.DECRYPT_MODE, Base64.decodeBase64(data), privateKey.getModulus().bitLength()), CHARSET);        } catch (Exception e) {            throw new RuntimeException("解密字符串[" + data + "]时遇到异常", e);        }    }

后端DES解密

    public static String decrypt(String data, String key) throws IOException,            Exception {        if (data == null)            return null;        BASE64Decoder decoder = new BASE64Decoder();        byte[] buf = decoder.decodeBuffer(data);        byte[] bt = decrypt(buf, key.getBytes("UTF-8"));        return new String(bt, "UTF-8");    }

后端自定义拦截器

public class XSSFilter implements Filter, Ordered {    @Override    public void init(FilterConfig filterConfig) throws ServletException {    }    @Override    public void destroy() {    }    @Override    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {        String contentType = request.getContentType();        if (StringUtils.isNotBlank(contentType) && contentType.contains("application/json")) {            XSSBodyRequestWrapper xssBodyRequestWrapper = new XSSBodyRequestWrapper((HttpServletRequest) request);            chain.doFilter(xssBodyRequestWrapper, response);        } else {            chain.doFilter(request, response);        }    }    @Override    public int getOrder() {        return 9;    }}
public class XSSBodyRequestWrapper extends HttpServletRequestWrapper {    private String body;    public XSSBodyRequestWrapper(HttpServletRequest request) {        super(request);        try{            body = XSSScriptUtil.handleString(CommonUtil.getBodyString(request));            String encrypt = request.getHeader("encrypt");            if (!StringUtil.isEmpty(encrypt)) {                String privateKey = RSAEncryptUtil.getSystemDefaultRSAPrivateKey();                String desEncryptStr = RSAEncryptUtil.decryptPKSC1(encrypt, privateKey);                JSONObject obj = JSONObject.parseObject(body);                String encryptParam = obj.getString("encryptParam");                body = DESEncryptUtil.decrypt(encryptParam, desEncryptStr);            }        }catch (Exception e){            e.printStackTrace();        }    }    @Override    public BufferedReader getReader() throws IOException {        return new BufferedReader(new InputStreamReader(getInputStream()));    }    @Override    public ServletInputStream getInputStream() throws IOException {        final ByteArrayInputStream bais = new ByteArrayInputStream(body.getBytes(Charset.forName("UTF-8")));        return new ServletInputStream() {            @Override            public int read() throws IOException {                return bais.read();            }            @Override            public boolean isFinished() {                return false;            }            @Override            public boolean isReady() {                return false;            }            @Override            public void setReadListener(ReadListener readListener) {            }        };    }}

感谢各位的阅读,以上就是“SpringBoot如何集成数据传输加密”的内容了,经过本文的学习后,相信大家对SpringBoot如何集成数据传输加密这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯