RSA加密登录请求

随着互联网技术的高速发展,对系统安全越来越高。我们做传统应用程序的也要提高自己系统的安全性,现在分享一下通过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文件都在附件中,如有需要请自行下载。

点击下载示例

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值