一個完美的 JavaScript 字符串 加密 和 解密 Demo

20150817195513_146.jpg

項目中經常會有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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章