首页 > 其他分享 >前端base64加密解密

前端base64加密解密

时间:2022-11-18 15:12:44浏览次数:39  
标签:function global return base64 Base64 解密 var 加密 fromCharCode

今天发现一个神奇的问题,用户反馈自己账号密码登不了,但是只有他一个人,然后自己区摸排,发现账号和密码输入的都一样就是登录不了,想到了base64的原因,因为我们的密码在进行交互的时候需要加密,于是去查一下base64文件,发现真的有问题,这里记录一下:

首先是错误的base64文件,这里并不是错误,只是有一部分加密时候会漏掉

//加密、解密算法封装:
function Base64()  
{  
    let _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" ;
    this.encode = function(e){  
        var t="";  
        var n,r,i,s,o,u,a;  
        var f=0;  
        e=_utf8_encode(e);  
        while(f<e.length){  
            n=e.charCodeAt(f++);  
            r=e.charCodeAt(f++);  
            i=e.charCodeAt(f++);  
            s=n>>2;  
            o=(n&3)<<4|r>>4;  
            u=(r&15)<<2|i>>6;  
            a=i&63;  
            if(isNaN(r)){  
                u=a=64  
            }else if(isNaN(i)){  
                a=64  
            }  
            t=t+_keyStr.charAt(s)+_keyStr.charAt(o)+_keyStr.charAt(u)+_keyStr.charAt(a)  
        }  
        return t  
    };
    this.decode = function(e){  
        var t="";  
        var n,r,i;  
        var s,o,u,a;  
        var f=0;  
        e=e.replace(/[^A-Za-z0-9+/=]/g,"");  
        while(f<e.length){  
            s=_keyStr.indexOf(e.charAt(f++));  
            o=_keyStr.indexOf(e.charAt(f++));  
            u=_keyStr.indexOf(e.charAt(f++));  
            a=_keyStr.indexOf(e.charAt(f++));  
            n=s<<2|o>>4;  
            r=(o&15)<<4|u>>2;  
            i=(u&3)<<6|a;  
            t=t+String.fromCharCode(n);  
            if(u!=64){  
                t=t+String.fromCharCode(r)  
            }  
            if(a!=64){  
                t=t+String.fromCharCode(i)  
            }  
        }  
        t=_utf8_decode(t);  
        return t  
    };
    let _utf8_encode = function(e){  
        e=e.replace(/rn/g,"n");  
        var t="";  
        for(var n=0;n<e.length;n++){  
            var r=e.charCodeAt(n);  
            if(r<128){  
                t+=String.fromCharCode(r)  
            }else if(r>127&&r<2048){  
                t+=String.fromCharCode(r>>6|192);  
                t+=String.fromCharCode(r&63|128)  
            }else{  
                t+=String.fromCharCode(r>>12|224);  
                t+=String.fromCharCode(r>>6&63|128);  
                t+=String.fromCharCode(r&63|128)  
            }  
        }  
        return t  
    };  
    let _utf8_decode = function(e){  
        var t="";  
        var n=0;  
        var r=0,c1=0,c2=0;  
        while(n<e.length){  
            r=e.charCodeAt(n);  
            if(r<128){  
                t+=String.fromCharCode(r);  
                n++  
            }else if(r>191&&r<224){  
                c2=e.charCodeAt(n+1);  
                t+=String.fromCharCode((r&31)<<6|c2&63);  
                n+=2  
            }else{  
                c2=e.charCodeAt(n+1);  
                c3=e.charCodeAt(n+2);  
                t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);  
                n+=3  
            }  
        }  
        return t  
    }  
};  
 
export {
    Base64,
}

引用:

 

 

 

 

上面这种对数字+字母大小写的时候是没有问题的,但是只加密纯小写字母就会出现缺少加密信息的问题.

换成了下面的完美结果:

/*
 *  base64.js
 *
 *  Licensed under the BSD 3-Clause License.
 *    http://opensource.org/licenses/BSD-3-Clause
 *
 *  References:
 *    http://en.wikipedia.org/wiki/Base64
 */
;(function (global, factory) {
    typeof exports === 'object' && typeof module !== 'undefined'
        ? module.exports = factory(global)
        : typeof define === 'function' && define.amd
        ? define(factory) : factory(global)
}((
    typeof self !== 'undefined' ? self
        : typeof window !== 'undefined' ? window
        : typeof global !== 'undefined' ? global
: this
), function(global) {
    'use strict';
    // existing version for noConflict()
    global = global || {};
    var _Base64 = global.Base64;
    var version = "2.5.2";
    // if node.js and NOT React Native, we use Buffer
    var buffer;
    if (typeof module !== 'undefined' && module.exports) {
        try {
            buffer = eval("require('buffer').Buffer");
        } catch (err) {
            buffer = undefined;
        }
    }
    // constants
    var b64chars
        = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    var b64tab = function(bin) {
        var t = {};
        for (var i = 0, l = bin.length; i < l; i++) t[bin.charAt(i)] = i;
        return t;
    }(b64chars);
    var fromCharCode = String.fromCharCode;
    // encoder stuff
    var cb_utob = function(c) {
        if (c.length < 2) {
            var cc = c.charCodeAt(0);
            return cc < 0x80 ? c
                : cc < 0x800 ? (fromCharCode(0xc0 | (cc >>> 6))
                                + fromCharCode(0x80 | (cc & 0x3f)))
                : (fromCharCode(0xe0 | ((cc >>> 12) & 0x0f))
                    + fromCharCode(0x80 | ((cc >>>  6) & 0x3f))
                    + fromCharCode(0x80 | ( cc         & 0x3f)));
        } else {
            var cc = 0x10000
                + (c.charCodeAt(0) - 0xD800) * 0x400
                + (c.charCodeAt(1) - 0xDC00);
            return (fromCharCode(0xf0 | ((cc >>> 18) & 0x07))
                    + fromCharCode(0x80 | ((cc >>> 12) & 0x3f))
                    + fromCharCode(0x80 | ((cc >>>  6) & 0x3f))
                    + fromCharCode(0x80 | ( cc         & 0x3f)));
        }
    };
    var re_utob = /[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g;
    var utob = function(u) {
        return u.replace(re_utob, cb_utob);
    };
    var cb_encode = function(ccc) {
        var padlen = [0, 2, 1][ccc.length % 3],
        ord = ccc.charCodeAt(0) << 16
            | ((ccc.length > 1 ? ccc.charCodeAt(1) : 0) << 8)
            | ((ccc.length > 2 ? ccc.charCodeAt(2) : 0)),
        chars = [
            b64chars.charAt( ord >>> 18),
            b64chars.charAt((ord >>> 12) & 63),
            padlen >= 2 ? '=' : b64chars.charAt((ord >>> 6) & 63),
            padlen >= 1 ? '=' : b64chars.charAt(ord & 63)
        ];
        return chars.join('');
    };
    var btoa = global.btoa ? function(b) {
        return global.btoa(b);
    } : function(b) {
        return b.replace(/[\s\S]{1,3}/g, cb_encode);
    };
    var _encode = function(u) {
        var isUint8Array = Object.prototype.toString.call(u) === '[object Uint8Array]';
        return isUint8Array ? u.toString('base64')
            : btoa(utob(String(u)));
    }
    var encode = function(u, urisafe) {
        return !urisafe
            ? _encode(u)
            : _encode(String(u)).replace(/[+\/]/g, function(m0) {
                return m0 == '+' ? '-' : '_';
            }).replace(/=/g, '');
    };
    var encodeURI = function(u) { return encode(u, true) };
    // decoder stuff
    var re_btou = /[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g;
    var cb_btou = function(cccc) {
        switch(cccc.length) {
        case 4:
            var cp = ((0x07 & cccc.charCodeAt(0)) << 18)
                |    ((0x3f & cccc.charCodeAt(1)) << 12)
                |    ((0x3f & cccc.charCodeAt(2)) <<  6)
                |     (0x3f & cccc.charCodeAt(3)),
            offset = cp - 0x10000;
            return (fromCharCode((offset  >>> 10) + 0xD800)
                    + fromCharCode((offset & 0x3FF) + 0xDC00));
        case 3:
            return fromCharCode(
                ((0x0f & cccc.charCodeAt(0)) << 12)
                    | ((0x3f & cccc.charCodeAt(1)) << 6)
                    |  (0x3f & cccc.charCodeAt(2))
            );
        default:
            return  fromCharCode(
                ((0x1f & cccc.charCodeAt(0)) << 6)
                    |  (0x3f & cccc.charCodeAt(1))
            );
        }
    };
    var btou = function(b) {
        return b.replace(re_btou, cb_btou);
    };
    var cb_decode = function(cccc) {
        var len = cccc.length,
        padlen = len % 4,
        n = (len > 0 ? b64tab[cccc.charAt(0)] << 18 : 0)
            | (len > 1 ? b64tab[cccc.charAt(1)] << 12 : 0)
            | (len > 2 ? b64tab[cccc.charAt(2)] <<  6 : 0)
            | (len > 3 ? b64tab[cccc.charAt(3)]       : 0),
        chars = [
            fromCharCode( n >>> 16),
            fromCharCode((n >>>  8) & 0xff),
            fromCharCode( n         & 0xff)
        ];
        chars.length -= [0, 0, 2, 1][padlen];
        return chars.join('');
    };
    var _atob = global.atob ? function(a) {
        return global.atob(a);
    } : function(a){
        return a.replace(/\S{1,4}/g, cb_decode);
    };
    var atob = function(a) {
        return _atob(String(a).replace(/[^A-Za-z0-9\+\/]/g, ''));
    };
    var _decode = buffer ?
        buffer.from && Uint8Array && buffer.from !== Uint8Array.from
        ? function(a) {
            return (a.constructor === buffer.constructor
                    ? a : buffer.from(a, 'base64')).toString();
        }
        : function(a) {
            return (a.constructor === buffer.constructor
                    ? a : new buffer(a, 'base64')).toString();
        }
        : function(a) { return btou(_atob(a)) };
    var decode = function(a){
        return _decode(
            String(a).replace(/[-_]/g, function(m0) { return m0 == '-' ? '+' : '/' })
                .replace(/[^A-Za-z0-9\+\/]/g, '')
        );
    };
    var noConflict = function() {
        var Base64 = global.Base64;
        global.Base64 = _Base64;
        return Base64;
    };
    // export Base64
    global.Base64 = {
        VERSION: version,
        atob: atob,
        btoa: btoa,
        fromBase64: decode,
        toBase64: encode,
        utob: utob,
        encode: encode,
        encodeURI: encodeURI,
        btou: btou,
        decode: decode,
        noConflict: noConflict,
        __buffer__: buffer
    };
    // if ES5 is available, make Base64.extendString() available
    if (typeof Object.defineProperty === 'function') {
        var noEnum = function(v){
            return {value:v,enumerable:false,writable:true,configurable:true};
        };
        global.Base64.extendString = function () {
            Object.defineProperty(
                String.prototype, 'fromBase64', noEnum(function () {
                    return decode(this)
                }));
            Object.defineProperty(
                String.prototype, 'toBase64', noEnum(function (urisafe) {
                    return encode(this, urisafe)
                }));
            Object.defineProperty(
                String.prototype, 'toBase64URI', noEnum(function () {
                    return encode(this, true)
                }));
        };
    }
    //
    // export Base64 to the namespace
    //
    if (global['Meteor']) { // Meteor.js
        Base64 = global.Base64;
    }
    // module.exports and AMD are mutually exclusive.
    // module.exports has precedence.
    if (typeof module !== 'undefined' && module.exports) {
        module.exports.Base64 = global.Base64;
    }
    else if (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define([], function(){ return global.Base64 });
    }
    // that's it!
    return {Base64: global.Base64}
}));

引用:

 

 到此完美解决.

标签:function,global,return,base64,Base64,解密,var,加密,fromCharCode
From: https://www.cnblogs.com/wgs-blog/p/16903284.html

相关文章

  • php openssl 实现非对称加密(RSA)
    需非对称加密实现类类似jwttoken令牌可能需要PHP需要安装openssl拓展才能实现代码:if(!function_exists('rsa')){/**rsa非对称算法生成*@returnarr......
  • js blob与base64互转、以及file和base64的相互转换
    file和base641.file文件转换为base64,得到base64格式图片varreader=newFileReader();reader.readAsDataURL(this.files[0]);reader.onload=function(){cons......
  • 发送邮件加密附件
    发送邮件加密附件最近家里有事,所以只能暂时用着笔记本(现在就是,不好用),还有接下来忙着复习考试,等考完试再慢慢补博客吧~~加班比较多,工作上也发生挺多事的,自己搞的生产故......
  • JS登录密码基于token和CryptoJS加密处理方法
    1.登录前先请求,获取一个token,也可以在本地写死暂且叫登录token,用来给登录时密码的加密asyncgetToken(){const{data:token}=awaitgetToken()//t......
  • jar包加密启动
    jar包加密启动参考文档:https://gitee.com/roseboy/classfinaljava-jarclassfinal-fatjar-1.2.1.jar-fileD:\xxx.jar-libjarsxxx.jar-packagescom.xxx-pwd#-Y......
  • Python 对称加密
    转载:https://www.cnblogs.com/pywen/p/15831353.htmlfrompyDesimportdes,CBC,PAD_PKCS5importbinasciidefKEY_8(KEY):iflen(KEY)>8:KEY=KE......
  • python rsa加解密
    pythonrsa加解密代码:只适用python3:importbase64fromCrypto.CipherimportPKCS1_v1_5fromCryptoimportRandomfromCrypto.PublicKeyimportRSA#-------......
  • 为什么要使用base64编码,有哪些情景需求?
    https://www.zhihu.com/question/36306744简单说,因为某些场合并不能传输或者储存二进制流。比如,如果一个传输协议是基于ASCII文本的,那么它就不能传输二进制流,那你要将......
  • 常规web流量分析总结及例题(普通http流量,http传输文件流量,https加密流量,视频流)
    web流量分析基本套路流量分析传输了数据:ziprarpngjpgtxtmp3,特别是流量包比较大时需要注意binwalk分离文件,grep或者wireshark内ctrl+f搜索分情况使用导出对象,导出分组字......
  • Forest请求前置操作RSA签名加密
    前言在很多时候为了安全需要将请求的参数签名签名加密,使用非对称加密-RSA,非对称加密有供钥和私钥两个概念,私钥自己拥有,不能给别人,公钥公开,根据应用的不同,我们可以选择不同......