項目中經常會有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>
結果: