zoukankan      html  css  js  c++  java
  • 编码、转码、加密、解密的几种方法(前端版)

    escape()

    函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。

    语法:escape("string")

    返回值:已编码的 string 的副本。其中某些字符被替换成了十六进制的转义序列。

    说明:escape 方法对所有空格、标点、重音符号以及其他非 ASCII 字符都用 %xx 编码代替,其中 xx 等于表示该字符的十六进制数。

          例如,空格返回的是 "%20"。字符值大于 255 的以 %uxxxx 格式存储。

    注释:可以使用 unescape() 对 escape() 编码的字符串进行解码。

    提示:ECMAScript v3 反对使用该方法,应用使用 decodeURI() 和 decodeURIComponent() 替代它。

    例子:

    escape("小星星")  // "%u5C0F%u661F%u661F"
    escape("?!=()#%&") // "%3F%21%3D%28%29%23%25%26"

    encodeURI() / encodeURIComponent()

    语法:encodeURI(str)

    说明:1:该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: ;/?:@&=+$,#   其他所有的字符都会被转义序列替换。

       2:encodeURI 方法只将URI中的空格和非AscII字符进行编码,编码后的URI可以正常访问(ajax中文问题可以使用encodeURI对url进行编码)

    语法:encodeURIComponent(str)

    说明:1、encodeURIComponent 方法除了将所有的专非ASCII字符编码外,还将一些特殊字符进行编码,如?#:,&等,编码后的URI不可访问。

       2、请注意,如果该字符串代表一个路径,例如 /folder1/folder2/default.html,其中的斜杠也将被编码。这样一来,当该编码结果被作为请求发送到 web 服务器属时将是无效的

    例子:

    encodeURI("小星星") // "%E5%B0%8F%E6%98%9F%E6%98%9F"
    decodeURI("%E5%B0%8F%E6%98%9F%E6%98%9F") // "小星星"
    encodeURIComponent("小星星")
    decodeURIComponent("%E5%B0%8F%E6%98%9F%E6%98%9F") // "小星星" 

    charCodeAt()

    把字符串转换成unicode编码值(数字类型的)

    使用举例:

    '9'.charCodeAt() // 57 把9转换成unicode编码值(数字57)
    
    String.fromCharCode(97) // a 把unicode编码97转换成字符串a

     


     base64encode转换

    js写base64函数,实测可用:

    <script>
      function base64EncodeChars() {
        return "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
      }
      function base64DecodeChars() {
        var dataDeco = new Array(
          -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
          -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
          -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
          52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
          -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
          15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
          -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
          41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);
        return dataDeco;
      }
      function base64encode(str) {
        var out, i, len;
        var c1, c2, c3;
        len = str.length;
        i = 0;
        out = "";
        while (i < len) {
          c1 = str.charCodeAt(i++) & 0xff;
          if (i == len) {
            out += base64EncodeChars().charAt(c1 >> 2);
            out += base64EncodeChars().charAt((c1 & 0x3) << 4);
            out += "==";
            break;
          }
          c2 = str.charCodeAt(i++);
          if (i == len) {
            out += base64EncodeChars().charAt(c1 >> 2);
            out += base64EncodeChars().charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
            out += base64EncodeChars().charAt((c2 & 0xF) << 2);
            out += "=";
            break;
          }
          c3 = str.charCodeAt(i++);
          out += base64EncodeChars().charAt(c1 >> 2);
          out += base64EncodeChars().charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
          out += base64EncodeChars().charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
          out += base64EncodeChars().charAt(c3 & 0x3F);
        }
        return out;
      }
      function base64decode(str) {
        var c1, c2, c3, c4;
        var i, len, out;
        len = str.length;
        i = 0;
        out = "";
        while (i < len) {
          do {
            c1 = base64DecodeChars()[str.charCodeAt(i++) & 0xff];
          } while (i < len && c1 == -1);
          if (c1 == -1)
            break;
          do {
            c2 = base64DecodeChars()[str.charCodeAt(i++) & 0xff];
          } while (i < len && c2 == -1);
          if (c2 == -1)
            break;
          out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));
          do {
            c3 = str.charCodeAt(i++) & 0xff;
            if (c3 == 61)
              return out;
            c3 = base64DecodeChars()[c3];
          } while (i < len && c3 == -1);
          if (c3 == -1)
            break;
          out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));
          do {
            c4 = str.charCodeAt(i++) & 0xff;
            if (c4 == 61)
              return out;
            c4 = base64DecodeChars()[c4];
          } while (i < len && c4 == -1);
          if (c4 == -1)
            break;
          out += String.fromCharCode(((c3 & 0x03) << 6) | c4);
        }
        return out;
      }
      function utf16to8(str) {
        var out, i, len, c;
        out = "";
        len = str.length;
        for (i = 0; i < len; i++) {
          c = str.charCodeAt(i);
          if ((c >= 0x0001) && (c <= 0x007F)) {
            out += str.charAt(i);
          } else if (c > 0x07FF) {
            out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
            out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
            out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
          } else {
            out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));
            out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
          }
        }
        return out;
      }
      function utf8to16(str) {
        var out, i, len, c;
        var char2, char3;
        out = "";
        len = str.length;
        i = 0;
        while (i < len) {
          c = str.charCodeAt(i++);
          switch (c >> 4) {
            case 0:
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
            case 6:
            case 7:
              // 0xxxxxxx
              out += str.charAt(i - 1);
              break;
            case 12:
            case 13:
              char2 = str.charCodeAt(i++);
              out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
              break;
            case 14:
              char2 = str.charCodeAt(i++);
              char3 = str.charCodeAt(i++);
              out += String.fromCharCode(((c & 0x0F) << 12) |
                ((char2 & 0x3F) << 6) |
                ((char3 & 0x3F) << 0));
              break;
          }
        }
        return out;
      }
      var Base64 = function () {
        return {
          encode: function (a) {
            return base64encode(utf16to8(a));
          },
          decode: function (a) {
            return utf8to16(base64decode(a));
          }
        }
      }();

      // 使用 console.log(Base64.encode(
    "小星星"), Base64.decode("5bCP5pif5pif")) // 调用方式 </script>

    AES

    高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥。

    1. 安装cryto-js:npm install crypto-js

    2. rsa加密解密函数:(cbc模式,base64格式,zeroPadding,16位)

    import CryptoJS from 'crypto-js/crypto-js'
    
    // 默认的 KEY 与 iv 如果没有给
    const KEY = CryptoJS.enc.Utf8.parse("1234567890123456");
    const IV = CryptoJS.enc.Utf8.parse('1234567890123456');
    /**
     * AES加密 :字符串 key iv  返回base64
     */
    export function Encrypt(word, keyStr, ivStr) {
      let key = KEY
      let iv = IV
    
      if (keyStr) {
        key = CryptoJS.enc.Utf8.parse(keyStr);
        iv = CryptoJS.enc.Utf8.parse(ivStr);
      }
    
      let srcs = CryptoJS.enc.Utf8.parse(word);
      var encrypted = CryptoJS.AES.encrypt(srcs, key, {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.ZeroPadding
      });
     // console.log("-=-=-=-", encrypted.ciphertext)
      return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
    
    }
    /**
     * AES 解密 :字符串 key iv  返回base64
     *
     */
    export function Decrypt(word, keyStr, ivStr) {
      let key  = KEY
      let iv = IV
    
      if (keyStr) {
        key = CryptoJS.enc.Utf8.parse(keyStr);
        iv = CryptoJS.enc.Utf8.parse(ivStr);
      }
    
      let base64 = CryptoJS.enc.Base64.parse(word);
      let src = CryptoJS.enc.Base64.stringify(base64);
    
      var decrypt = CryptoJS.AES.decrypt(src, key, {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.ZeroPadding
      });
    
      var decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
      return decryptedStr.toString();
    }

    3. 在组件中使用:

    import {Decrypt, Encrypt} from '刚刚封装的js'
    
    var parm1 = Decrypt('加密的字段', key, iv)
    console.log('加密之后的字段:', parm1)
    
    var parm2 = Decrypt('解密的字段', key, iv)
    console.log('解密之后的字段:', parm2)

     备注:密钥最好是数字,不然可能会报错(报代码的错误,其实代码没问题)

     

  • 相关阅读:
    防火墙透明模式
    HP管理工具System Management Homepage安装配置
    kbmmw 中JSON 中使用SQL 查询
    kbmmw 中JSON 操作入门
    第一个kbmmw for Linux 服务器
    kbmmw 5.02发布
    kbmmw 5.01 发布
    使用delphi 10.2 开发linux 上的Daemon
    使用unidac 在linux 上无驱动直接访问MS SQL SERVER
    使用delphi 10.2 开发linux 上的webservice
  • 原文地址:https://www.cnblogs.com/MrZhujl/p/12108994.html
Copyright © 2011-2022 走看看