您的位置:首页 > Web前端 > JavaScript

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

2017-07-26 16:46 981 查看
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,就可以满足现在的这个需求。这里记录一下,因为用的较少,

有时间可以回顾一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: