1、后端引入hutool包,主要用于使用RSA加密工具
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.4</version>
</dependency>
2、后端随机生成公钥与私钥,本处为解决每次生成新的秘钥带来性能的损耗,因此采用单例模式思想,回传公钥至前端。
private RSA rsa;
@GetMapping("/login")
String login(Model model) {
if (this.rsa == null) {
this.rsa = new RSA();
}
model.addAttribute("publicKey", this.rsa.getPublicKeyBase64());
return "loginforasset";
}
3、前端接收公钥,采用input框的方式接收,否则该公钥不会识别为字符串
<input id="publicKey" name="publicKey" th:value="${publicKey}" hidden>
4、引入js加密工具文件,直接复制如下链接,将其获取的内容复制粘贴成 jsencrypt.js 文件,并引入系统使用。
https://cdn.bootcdn.net/ajax/libs/jsencrypt/3.2.1/jsencrypt.js
//引入js
<script src="/js/jsencrypt.js"></script>
5、ajax回传密码前执行加密
function login() {
var encrypt = new JSEncrypt(); //初始化加密
encrypt.setPublicKey($("#publicKey").val()); // 设置公钥
$.ajax({
type: "POST",
url: ctx + "login",
async: false,
dataType: 'json',
data: {
username: $("#username").val(),
password: encrypt.encrypt($("#password").val()), //加密步骤
validateCode: $("#validateCode").val()
},
success: function (r) {
if (r.code == 0) {
var index = layer.load(1, {
shade: [0.1, '#fff'] //0.1透明度的白色背景
});
parent.location.href = '/index';
} else {
changeImg();
layer.msg(r.msg);
}
},
});
}
6、后端解密
@Log("登录")
@PostMapping("/login")
@ResponseBody
R ajaxLogin(String username, String password, String validateCode, HttpServletRequest request) {
password = this.rsa.decryptStr(password, KeyType.PrivateKey);
// 后续就是密码验证等工作
}
7、到此处就实现了前后端密码的RSA加密传输的功能。