JS实现BASE64加密解密-后台加密前台解密案例分析

JS实现BASE64加密解密-后台加密前台解密案例分析


    通常的业务场景,我们并不会在前端进行加密解密的相关操作。原因很简单,前端没法让人放心,很容易被攻击。但是最近的
这个项目,由于无法在后台保存Session,导致用户信息的维护变的很复杂。从统一权限系统登录时,需要传递加密后的用户ID。
这个加密后的用户ID会作为URL的一部分,然后前端会从URL上直接截取这个加密后的用户ID。这样从前端传递到后台的用户ID,都是
这个加密后的用户ID。导致的结果就是每次请求都要在后台解密这个用户ID,工作量很大,且风险较大。经过细致的分析,我最后觉得
在前端进行解密,每次请求获取用户ID时,都调用这段公共的JS代码,这样后台代码就不用改动了。


    后台BASE64加密,我们使用的API是:Decoder.BASE64Encoder,使用sun.misc.BASE64Decoder同理。通常我们是这样来加密的:


BASE64Encoder encoder = new BASE64Encoder();
userId = encoder.encode(userId.getBytes()); 

    然后这样来解密:


BASE64Decoder decoder = new BASE64Decoder();
str = new String(decoder.decodeBuffer(str));


    现在的业务场景是,我们在后台使用BASE64加密的字符串,需要在前台进行BASE64解密。我们需要先引入Base64.js这个包。然后调用
Base64.decode(str)就可以解密了。先来看看Base64.js


var Base64=
{
	_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
	encode:function(e){
		var t="";
		var n,r,i,s,o,u,a;
		var f=0;
		e=Base64._utf8_encode(e);
		while(f<e.length){
			n=e.charCodeAt(f++);
			r=e.charCodeAt(f++);
			i=e.charCodeAt(f++);
			s=n>>2;
			o=(n&3)<<4|r>>4;
			u=(r&15)<<2|i>>6;
			a=i&63;
			if(isNaN(r)){
				u=a=64
			}else if(isNaN(i)){
				a=64
			}
			t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)
		}
		return t
	},
	decode:function(e){
		var t="";
		var n,r,i;
		var s,o,u,a;
		var f=0;
		e=e.replace(/[^A-Za-z0-9+/=]/g,"");
		while(f<e.length){
			s=this._keyStr.indexOf(e.charAt(f++));
			o=this._keyStr.indexOf(e.charAt(f++));
			u=this._keyStr.indexOf(e.charAt(f++));
			a=this._keyStr.indexOf(e.charAt(f++));
			n=s<<2|o>>4;
			r=(o&15)<<4|u>>2;
			i=(u&3)<<6|a;
			t=t+String.fromCharCode(n);
			if(u!=64){
				t=t+String.fromCharCode(r)
			}
			if(a!=64){
				t=t+String.fromCharCode(i)
			}
		}
		t=Base64._utf8_decode(t);
		return t
	},
	_utf8_encode:function(e){
		e=e.replace(/rn/g,"n");
		var t="";
		for(var n=0;n<e.length;n++){
			var r=e.charCodeAt(n);
			if(r<128){
				t+=String.fromCharCode(r)
			}else if(r>127&&r<2048){
				t+=String.fromCharCode(r>>6|192);
				t+=String.fromCharCode(r&63|128)
			}else{
				t+=String.fromCharCode(r>>12|224);
				t+=String.fromCharCode(r>>6&63|128);
				t+=String.fromCharCode(r&63|128)
			}
		}
		return t
	},
	_utf8_decode:function(e){
		var t="";
		var n=0;
		var r=c1=c2=0;
		while(n<e.length){
			r=e.charCodeAt(n);
			if(r<128){
				t+=String.fromCharCode(r);
				n++
			}else if(r>191&&r<224){
				c2=e.charCodeAt(n+1);
				t+=String.fromCharCode((r&31)<<6|c2&63);
				n+=2
			}else{
				c2=e.charCodeAt(n+1);
				c3=e.charCodeAt(n+2);
				t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);
				n+=3
			}
		}
		return t
	}
};

    就是上面这段代码,短短几十行代码,不是很复杂,有兴趣的朋友,可以研究一下。Base64.js对外提供了2个方法,一个是加密
方法encode(e),一个是解密方法decode(e)。OK,有了这个Base64.js,就可以满足现在的这个需求。这里记录一下,因为用的较少,
有时间可以回顾一下。




  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值