前言
- 近两年来整个大环境下都在强调安全生产,网站安全问题也越来越突出,所以每个网站都要对敏感数据加密传输,本文则介绍业界最常用的两种加密算法,RSA和AES,希望各位尽快把系统安全问题补起来
效果展示
- 点如下链接在线体验一下RSA和AES加密算法
https://yanxiaojun617.com/fileService/file/encrypt/index.html
你可以在浏览器右键审核元素查看源码
核心代码:
RSA非对称加密使用jsencrypt:jsencrypt github、jsencrypt cdn
AES非对称加密使用crypto-js:crypto-js github、crypto-js cdn
我简单封装了调用方法encrypt.js
关于RSA
- RSA加密算法是一种非对称加密算法,什么是非对称加密?上面在线体验链接已经看到,RSA加密需要公钥,解密需要私钥,这公钥和私钥不一样,所以就是非对称加密
- 在实际使用中,公钥保存在客户端(前端),私钥只保存在服务端(后端),公钥用于加密,把加密后的数据传给服务端,服务端用私钥解密,由于私钥只保存在服务端,所以只有服务端能解出密文,所以数据在传输过程中被“有心人”截取也不能解密
注:上面在线体验链接,我给出了私钥解密功能,实际私钥解密要放在服务端,一会介绍服务端用java语言解密方法;为了保证私钥的安全性,公司有后端人员离职,可以考虑更换秘钥对 - 非对称加密的缺点是效率相对比较低,所以一般只用于加密少量敏感数据:如token、用户名密码等;由于是公钥加密,私钥解密,私钥一定要放在服务端,所以也只是客户端向服务端传输加密数据;如何安全的加密大量数据?如何让服务端返回的数据也是安全加密的?这时候就要用RSA和AES的结合
关于AES
- AES加密算法用到一个key值(随机生成一个字符串),这个key值同时用于加密和解密,所以叫对称加密,由于是对称加密所以加密效率高
- 如何安全的加密并传输大量数据?
客户端用key值加密数据,然后把key和加密的数据传给服务端,服务端用接收到的key解密,所以只要保证key值的传输安全就能保证数据安全,如何保证key的安全?你肯定想到了,就是用上面介绍的RSA非对称算法加密key,所以服务端最终接收到的数据是RSA加密的key和AES加密的真实内容,服务端先用私钥解密得到key,在用key解密密文 - 如何让服务端返回的数据也是安全加密的?
客户端动态生成key,用RAS非对称算法加密key,发起请求把加密后的key传给服务端,服务端用私钥解密得到key,用key使用AES对称算法加密数据,在把数据返回给前端,前端用自己生成的key解密数据
服务端
- 服务端做什么事?用私钥解密数据;AES算法加密和解密数据;还可以生成RSA算法秘钥对
- 下面演示java中使用RSA和AES加密算法,两种方法用到的加密类均来自java jdk自带的加密类,不用额外引入jar包,我用的是jdk1.8
- 为了方便使用把RSA和AES加密算法封装为工具类方便调用,还有个测试类TestApi.java
RSAUtils.java
AESUtils.java
TestApi.java
java-rsa测试流程
- 复制在线体验链接提供的私钥(图1),到测试类TestApi.java中privateKey(图2)
图1
图2
2.点击ras加密,复制加密内容到上图2中的“bodyStr”中
3.运行main方法,我们看到输入的内容是解密前的结果,说明前端公钥加密,后端私钥解密,js方法和java方法匹配
java-aes测试流程
- 复制key和加密内容到TestApi.java中,如下图2
图1
图2 - 运行main方法,可以看到下图加密的结果和上图1加密的结果一致,说明js方法和java方法匹配
在ionic中使用
- 在ionic和上面使用方法类似,无非是用typescript重写encrypt.js
这里提供一个我项目中的typescript版本
https://github.com/yanxiaojun617/ionic4_tabs/blob/master/src/app/providers/Encrypt.ts
其他
- 实际工作中,前后端通讯均是通过异步请求,加密的内容均放在body中,并且传输的内容一般是json字符串,所以后端需要用Json工具类转为字符串到java对象,转java对象到字符串。这里提供一个封装的JacksonUtils.java工具类
另外需要导入jar包,以下是我项目gradle项目配置
compile 'com.fasterxml.jackson.core:jackson-annotations:2.8.0'
compile 'com.fasterxml.jackson.core:jackson-core:2.8.10'
compile 'com.fasterxml.jackson.core:jackson-databind:2.8.10'
- 其他后端语言加密算法的实现请自行百度
网友评论