赞
踩
实现了前端对数据进行加密后传输,后端对加密的数据进行解密,然后去数据库对比。因为要解密所以采用对称加密算法。不讨论哪个对称加密算法好,这里采用DES,在实现的过程中发现要找一个js版本的DES加密,并且java能DES解密的还真不容易。
加解密思路
由于是对称加密,所以加解密的密钥就非常重要。这里采用uuid作为加解密的密钥,而且每次请求页面时生成的uuid都不一样,保证每次的密钥都不知道是什么。
看后端生成密钥的过程
@RequestMapping(value = "/login.html", method = RequestMethod.GET)
public String login(Model model, HttpSession session) {
logger.info("登录页面");
session.setAttribute(SessionParam.LOGIN_KEY, UUIDGenerator.getUUID());
model.addAttribute("title", "用户登录");
return "admin/login";
}
在进入login页面的时候将生成的uuid放进session中。
// 密码进行两次md5
var passwordMd5 = CryptoJS.MD5(password);
passwordMd5 = CryptoJS.MD5(passwordMd5);
// console.info("md5:" + passwordMd5);
$(this).val("正在登录...");
$(this).attr("disabled", true);
// 用户名des加密
username = encryptByDES(username, key);
// 填充表单并提交表单
$("#postUsername").val(username);
$('#postPassword').val(passwordMd5);
$('#postForm').submit();
// DES加密
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();
}
当表单准备好之后,对密码进行两次MD5,用户名则采用DES加密,加密的密钥就是session中保存的那个uuid
后端再对传过来的用户名进行解密,因为数据库本来就存的是密码的两次MD5的值,所以只对用户名进行加密,因为即使密码被获取到,也不知道是什么。
后端过程
// 得到加密密钥
logger.info("-----原始数据:username:{} password:{}-----", username, password);
String key = session.getAttribute(SessionParam.LOGIN_KEY) + "";
logger.info("-----加解密key:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。