项目中经常会有url带参并取参数值的问题
我们通常会将参数明码通过URL传递。
如果涉及到对参数值安全性有一定的要求,那么就需要考虑对字符串加密了。
在平时项目开发中经常会用到前端加密传递参数,下面这个Demo是我修改完善后一直在使用的。
特点:
1、支持自定义密钥
2、支持中文加密
3、最重要的是随机数功能,每次加密后的字符串都不相同的,防止用户破解、篡改。
注意:
1、默认加密密钥为123456789,使用者可自定义修改。
2、/需要加载一个Base64.js文件 可以上网自行下载
3、如果有不懂请留言。
/**
* JS字符串加密和解密
* @date: 2018年06月07日 上午10:03:41
* @author Senao
* @param {[string]} [str] [需要加密/解密的字符串(包括中文)]
* @param {[string]} [pwd] [密码]
* @param {[string]} [type] [类型:E = 加密 、D = 解密]
* @return {[string]}
*/
function Secret_Key(str,pwd,type) {
var b = new Base64(); //需要加载一个Base64.js文件 可以上网自行下载
if(type=='E'){ //加密
str = b.encode(str);//Base64加密
var prand = "";
for(var i=0; i<pwd.length; i++) {
prand += pwd.charCodeAt(i).toString();
}
var sPos = Math.floor(prand.length / 5);
var mult = parseInt(prand.charAt(sPos) + prand.charAt(sPos*2) + prand.charAt(sPos*3) + prand.charAt(sPos*4) + prand.charAt(sPos*5));
var incr = Math.ceil(pwd.length / 2);
var modu = Math.pow(2, 31) - 1;
if(mult < 2) {
alert("Please choose a more complex or longer password.");
return null;
}
var salt = Math.round(Math.random() * 1000000000) % 100000000;
prand += salt;
while(prand.length > 10) {
prand = (parseInt(prand.substring(0, 10)) + parseInt(prand.substring(10, prand.length))).toString();
}
prand = (mult * prand + incr) % modu;
var enc_chr = "";
var enc_str = "";
for(var i=0; i<str.length; i++) {
enc_chr = parseInt(str.charCodeAt(i) ^ Math.floor((prand / modu) * 255));
if(enc_chr < 16) {
enc_str += "0" + enc_chr.toString(16);
} else enc_str += enc_chr.toString(16);
prand = (mult * prand + incr) % modu;
}
salt = salt.toString(16);
while(salt.length < 8)salt = "0" + salt;
enc_str += salt;
return enc_str;
}
if(type=='D'){ //解密
var prand = "";
for(var i=0; i<pwd.length; i++) {
prand += pwd.charCodeAt(i).toString();
}
var sPos = Math.floor(prand.length / 5);
var mult = parseInt(prand.charAt(sPos) + prand.charAt(sPos*2) + prand.charAt(sPos*3) + prand.charAt(sPos*4) + prand.charAt(sPos*5));
var incr = Math.round(pwd.length / 2);
var modu = Math.pow(2, 31) - 1;
var salt = parseInt(str.substring(str.length - 8, str.length), 16);
str = str.substring(0, str.length - 8);
prand += salt;
while(prand.length > 10) {
prand = (parseInt(prand.substring(0, 10)) + parseInt(prand.substring(10, prand.length))).toString();
}
prand = (mult * prand + incr) % modu;
var enc_chr = "";
var enc_str = "";
for(var i=0; i<str.length; i+=2) {
enc_chr = parseInt(parseInt(str.substring(i, i+2), 16) ^ Math.floor((prand / modu) * 255));
enc_str += String.fromCharCode(enc_chr);
prand = (mult * prand + incr) % modu;
}
return b.decode(enc_str);
}
}
下面是HTML代码:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta http-equiv="Content-Language" content="zh-CN"/>
<meta http-equiv="Expires" CONTENT="0">
<meta http-equiv="Cache-Control" CONTENT="no-cache">
<meta http-equiv="Pragma" CONTENT="no-cache">
<title>一个完美的JS加密和解密程序</title>
<script src="Base64.js"></script>
<script src="pass.js"></script>
<script src="jquery-1.8.3.min.js"></script>
</head>
<body>
<p id="demo1">加密后:</p>
<p id="demo2">解密后:</p>
</body>
<script language="javascript">
var str1='字符串@加密Dome';
var psd = '123456789';
var pass1=Secret_Key(str1,psd,'E');
var pass2=Secret_Key(pass1,psd,'D');
$('#demo1').append(pass1);
$('#demo2').append(pass2);
</script>
</html>
结果:
QQ截图20180607102402.png
网友评论