JS实现一个base64的加密解密方法

10646次阅读 417人点赞 作者: WuBin 发布时间: 2023-02-16 17:10:59
扫码到手机查看

btoa和atob

btoa 和 atob 是window对象的两个函数,其中:btoa :是binary to ascii,用于将binary的数据用ascii码表示,即Base64的编码过程atob:是ascii to binary,用于将ascii码解析成binary数据,即Base64的解码过程。

btoa 和 atob不能用于uniapp中的项目上,因为这俩方法是挂在windows对象下,而uni中是没有window这个概念的。

btoa

binary to ascii,用于将ascii字符串二进制数据转换成一个base64编码过的字符串表示,即Base64的编码过程,常用于编码字符串

var str = "hello world";
var demo = btoa(str);
console.log(demo);// aGVsbG8gd29ybGQ=

【注意】btoa不能编辑Unicode字符

var str = "好好学习";
var demo = btoa(str);
console.log(demo);

上面操作,此时会报错,翻译过来就是:无法在“Window”上执行“btoa”:要编码的字符串包含超出 Latin1 范围的字符

atob

ascii to binary,用于解码一个已经被base-64编码过的数据,即解码Base64编码的字符串

var demo = "aGVsbG8gd29ybGQ=";
var str = atob(demo);
console.log(str);//hello world

Unicode字符编码

刚才上面的例子中我们想对Unicode字符编码进行编码,直接使用btoa不行的,所以我们使用encodeURIComponent和decodeURIComponent方法。因为 btoa 仅支持 ASCII 字符序列,如所以我们要先使用 encodeURIComponent ,将中文字符编码转变成ASCII字符序列。

编码时,先用encodeURIComponent字符串进行编码,再用btoa进行Base64编码;解码时,先用atobBase64编码的串进行解码,再用decodeURIComponent字符串进行解码

注意:

  • 编码的过程:Unicode字符 -------> 先encodeURI -------> 再btoa编码
  • 解码的过程:先atob解码 -------> 再decodeURI -------> Unicode字符
var str = "好好学习";
var demo = btoa(encodeURIComponent(str));
console.log(demo);//JUU1JUE1JUJEJUU1JUE1JUJEJUU1JUFEJUE2JUU0JUI5JUEw

var demo = 'JUU1JUE1JUJEJUU1JUE1JUJEJUU1JUFEJUE2JUU0JUI5JUEw'
var str1 = decodeURIComponent(atob(demo))
console.log(str1)//好好学习

不过虽然到达了曲线救国的目的,但是由于encodeURIComponentdecodeURIComponent已经达到了转义控制字符的目的,使用atobbtoa感觉是多此一举。

IE低版本处理方式

在使用atob和btoa这两个函数时需要注意的是,IE9是不支持的(虽然现在基本都是面向Chrome浏览器编程)

我们使用第三方Base64工具:CryptoJS

中文文档:https://www.cnblogs.com/huiguo/p/16601076.html

原始文档:https://code.google.com/archive/p/crypto-js/

const CryptoJS = require("crypto-js");
let value = "hello";
let trans = CryptoJS.enc.Utf8.parse(value);
let encrypted = CryptoJS.enc.Base64.stringify(trans);
console.log(encrypted)

自己编写

//1.加密解密方法使用:

//1.加密  
var str = '123';  //需要加密的文字
var base = new Base64();  
var result = base.encode(str);  
console.log("加密后:"+result);
//2.解密  
var result2 = base.decode(result);  
//2.加密、解密算法封装:
console.log("解密后:"+result2); 
/**
 * 定义Base64加解密的类
 */
function Base64() {  
   //安全工程方法
    if(!(this instanceof Base64)){
        return new Base64();;
    }
    // private property  
    var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";  

    /**
     * 定义加密的方法
     * @param  {[type]} input [description]
     * @return {[type]}       [description]
     */
    this.encode = function (input) {  
        var output = "";  
        var chr1, chr2, chr3, enc1, enc2, enc3, enc4;  
        var i = 0;  
        input = _utf8_encode(input);  
        while (i < input.length) {  
            chr1 = input.charCodeAt(i++);  
            chr2 = input.charCodeAt(i++);  
            chr3 = input.charCodeAt(i++);  
            enc1 = chr1 >> 2;  
            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);  
            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);  
            enc4 = chr3 & 63;  
            if (isNaN(chr2)) {  
                enc3 = enc4 = 64;  
            } else if (isNaN(chr3)) {  
                enc4 = 64;  
            }  
            output = output +  
            _keyStr.charAt(enc1) + _keyStr.charAt(enc2) +  
            _keyStr.charAt(enc3) + _keyStr.charAt(enc4);  
        }  
        return output;  
    }  

    /**
     * 定义解密的方法
     * @param  {[type]} input [description]
     * @return {[type]}       [description]
     */
    this.decode = function (input) {  
        var output = "";  
        var chr1, chr2, chr3;  
        var enc1, enc2, enc3, enc4;  
        var i = 0;  
        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");  
        while (i < input.length) {  
            enc1 = _keyStr.indexOf(input.charAt(i++));  
            enc2 = _keyStr.indexOf(input.charAt(i++));  
            enc3 = _keyStr.indexOf(input.charAt(i++));  
            enc4 = _keyStr.indexOf(input.charAt(i++));  
            chr1 = (enc1 << 2) | (enc2 >> 4);  
            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);  
            chr3 = ((enc3 & 3) << 6) | enc4;  
            output = output + String.fromCharCode(chr1);  
            if (enc3 != 64) {  
                output = output + String.fromCharCode(chr2);  
            }  
            if (enc4 != 64) {  
                output = output + String.fromCharCode(chr3);  
            }  
        }  
        output = _utf8_decode(output);  
        return output;  
    }  

    // private method for UTF-8 encoding  
    _utf8_encode = function (string) {  
        string = string.replace(/\r\n/g,"\n");  
        var utftext = "";  
        for (var n = 0; n < string.length; n++) {  
            var c = string.charCodeAt(n);  
            if (c < 128) {  
                utftext += String.fromCharCode(c);  
            } else if((c > 127) && (c < 2048)) {  
                utftext += String.fromCharCode((c >> 6) | 192);  
                utftext += String.fromCharCode((c & 63) | 128);  
            } else {  
                utftext += String.fromCharCode((c >> 12) | 224);  
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);  
                utftext += String.fromCharCode((c & 63) | 128);  
            }  

        }  
        return utftext;  
    }  

    // private method for UTF-8 decoding  
    _utf8_decode = function (utftext) {  
        var string = "";  
        var i = 0;  
        var c = c1 = c2 = 0;  
        while ( i < utftext.length ) {  
            c = utftext.charCodeAt(i);  
            if (c < 128) {  
                string += String.fromCharCode(c);  
                i++;  
            } else if((c > 191) && (c < 224)) {  
                c2 = utftext.charCodeAt(i+1);  
                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));  
                i += 2;  
            } else {  
                c2 = utftext.charCodeAt(i+1);  
                c3 = utftext.charCodeAt(i+2);  
                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));  
                i += 3;  
            }  
        }  
        return string;  
    }  
}

相关资料

点赞 支持一下 觉得不错?客官您就稍微鼓励一下吧!
关键词:base64,atob,btoa
推荐阅读
  • uniapp实现被浏览器唤起的功能

    当用户打开h5链接时候,点击打开app若用户在已经安装过app的情况下直接打开app,若未安装过跳到应用市场下载安装这个功能在实现上主要分为两种场景,从普通浏览器唤醒以及从微信唤醒。

    9119次阅读 589人点赞 发布时间: 2022-12-14 16:34:53 立即查看
  • Vue

    盘点Vue2和Vue3的10种组件通信方式

    Vue中组件通信方式有很多,其中Vue2和Vue3实现起来也会有很多差异;本文将通过选项式API组合式API以及setup三种不同实现方式全面介绍Vue2和Vue3的组件通信方式。

    3884次阅读 289人点赞 发布时间: 2022-08-19 09:40:16 立即查看
  • JS

    几个高级前端常用的API

    推荐4个前端开发中常用的高端API,分别是MutationObserver、IntersectionObserver、getComputedstyle、getBoundingClientRect、requ...

    14139次阅读 919人点赞 发布时间: 2021-11-11 09:39:54 立即查看
  • PHP

    【正则】一些常用的正则表达式总结

    在日常开发中,正则表达式是非常有用的,正则表达式在每个语言中都是可以使用的,他就跟JSON一样,是通用的。了解一些常用的正则表达式,能大大提高你的工作效率。

    12947次阅读 445人点赞 发布时间: 2021-10-09 15:58:58 立即查看
  • 【中文】免费可商用字体下载与考证

    65款免费、可商用、无任何限制中文字体打包下载,这些字体都是经过长期验证,经得住市场考验的,让您规避被无良厂商起诉的风险。

    11539次阅读 926人点赞 发布时间: 2021-07-05 15:28:45 立即查看
  • Vue

    Vue3开发一个v-loading的自定义指令

    在vue3中实现一个自定义的指令,有助于我们简化开发,简化复用,通过一个指令的调用即可实现一些可高度复用的交互。

    15646次阅读 1248人点赞 发布时间: 2021-07-02 15:58:35 立即查看
  • JS

    关于手机上滚动穿透问题的解决

    当页面出现浮层的时候,滑动浮层的内容,正常情况下预期应该是浮层下边的内容不会滚动;然而事实并非如此。在PC上使用css即可解决,但是在手机端,情况就变的比较复杂,就需要禁止触摸事件才可以。

    14843次阅读 1209人点赞 发布时间: 2021-05-31 09:25:50 立即查看
  • Vue

    Vue+html2canvas截图空白的问题

    在使用vue做信网单页专题时,有海报生成的功能,这里推荐2个插件:一个是html2canvas,构造好DOM然后转canvas进行截图;另外使用vue-canvas-poster(这个截止到2021年3月...

    29040次阅读 2281人点赞 发布时间: 2021-03-02 09:04:51 立即查看
  • Vue

    vue-router4过度动画无效解决方案

    在初次使用vue3+vue-router4时候,先后遇到了过度动画transition进入和退出分别无效的情况,搜遍百度没没找到合适解决方法,包括vue-route4有一些API都进行了变化,以前的一些操...

    25064次阅读 1931人点赞 发布时间: 2021-02-23 13:37:20 立即查看
交流 收藏 目录