随着互联网技术的高速发展,对系统安全越来越高。我们做传统应用程序的也要提高自己系统的安全性,现在分享一下通过RSA加密登录请求的示例。
RSA,非对称加密。直白一点的理解就是加密和解密使用的KEY是不同的。
演示一个完整的登录示例:
1、在浏览器端请求公钥,使用js加密登录数据。
<script type='text/javascript' src="js/jquery/rsa/jsbn.js"></script>
<script type='text/javascript' src="js/jquery/rsa/prng4.js"></script>
<script type='text/javascript' src="js/jquery/rsa/rng.js"></script>
<script type='text/javascript' src="js/jquery/rsa/rsa.js"></script>
<script type='text/javascript' src="js/jquery/rsa/base64.js"></script>
var modulus,exponent;
jQuery(function(){
jQuery.getJSON("getPublicKey.do",function(data){
modulus = data["modulus"];
exponent = data["exponent"];
});
});
function dl() {
var password = jQuery("#password").val();
if (jQuery("#userName") == "" || password == "") {
showAlert("用户名和密码不能为空!");
return false;
}
var rsaKey = new RSAKey();
rsaKey.setPublic(b64tohex(modulus), b64tohex(exponent));
var enPassword = hex2b64(rsaKey.encrypt(password));
jQuery("#password").val(enPassword);
jQuery("#loginForm").submit();
}
java示例返回公钥,RAS工具类生成密钥对(返回公钥、将私钥存储于session中)
/*****生成密钥对,返回公钥、私钥放session********/
public RSAPublicKey generateKey(HttpServletRequest request) {
KeyPair keyPair = RSAUtils.generateKeyPair();
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
HttpSession session = request.getSession();
session.setAttribute(PRIVATE_KEY_ATTRIBUTE_NAME, privateKey);
return publicKey;
}
/**
* 获取加密登录公共key
* @return
*/
public String getPublicKey(){
RSALoginService rsaLoginService = new RSALoginService();
RSAPublicKey publicKey = rsaLoginService.generateKey(request);
byte[] modulus = publicKey.getModulus().toByteArray();
byte[] exponent = publicKey.getPublicExponent().toByteArray();
Map<String,String> map = new HashMap<String,String>();
map.put("modulus", org.apache.commons.codec.binary.Base64.encodeBase64String(modulus));
map.put("exponent", org.apache.commons.codec.binary.Base64.encodeBase64String(exponent));
getValueStack().set(DATA, map);
return DATA;
}
2、登录解密
String enPassword = request.getParameter("password");
RSALoginService rsaLoginService = new RSALoginService();
String password = rsaLoginService.decryptParameter(enPassword, request);
rsaLoginService.removePrivateKey(request);
/*********解密字符串*****************/
public String decryptParameter(String parameter, HttpServletRequest request) {
if (parameter != null) {
HttpSession session = request.getSession();
RSAPrivateKey privateKey = (RSAPrivateKey) session.getAttribute(PRIVATE_KEY_ATTRIBUTE_NAME);
if (privateKey != null && StringUtils.isNotNull(parameter)) {
return RSAUtils.decrypt(privateKey, parameter);
}
}
return null;
}
例子中依赖的jar包及js文件都在附件中,如有需要请自行下载。