美文网首页JavaScript程序员程序员
一个完美的 JavaScript 字符串 加密 和 解密 Dem

一个完美的 JavaScript 字符串 加密 和 解密 Dem

作者: Senao | 来源:发表于2018-06-07 10:25 被阅读0次
    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

    相关文章

      网友评论

        本文标题:一个完美的 JavaScript 字符串 加密 和 解密 Dem

        本文链接:https://www.haomeiwen.com/subject/plvwsftx.html