encryptjs 这个加密库在微信开发者工具里面不能使用了
发布于 6 年前 作者 swu 2131 次浏览 来自 问答

之前一直能正常用的,最近升级了一下开发者工具,升级到v1.02.1805180,然后突然发现 encryptjs 解密不对了。用 encryptjs 官方的例子代码测试了一下:

var encrypt = require(‘encryptjs’);

       var secretkey=‘ios’;

     var plaintext=‘apple’;

     var cipherText =encrypt.encrypt(plaintext,secretkey,256);

     console.log(cipherText+" ****************** ");

     var decipher=encrypt.decrypt(cipherText,secretkey,256);

     console.log("Deciphered Text is : "+decipher);

在浏览器里面正确输出:‘apple’;  在微信开发者工具里面输出是乱码,而且每次都不一样。

请问这个库是做了什么限制了吗?如果不能用,有什么可以用的加密库推荐呢?谢谢!

ps: 刚更新了最新版本 1805181,问题依然存在,输出示例:

wrYDB8OwUHMCW1/CrcKWG2c= ****************** 

Deciphered Text is : ÒêJNµr4:

1 回复

自己跟了一下,找到问题了,在 encryptjs 库中,加密和解密分别用了 base64Encode / base64Decode

而根据运行环境不同, base64使用的方法不同,实现如下:

if (typeof String.prototype.base64Encode == ‘undefined’) {

        String.prototype.base64Encode = function() {

            if (typeof btoa != ‘undefined’) return btoa(this); // browser

            if (typeof Buffer != ‘undefined’) return new Buffer(this, ‘utf8’).toString(‘base64’); // Node.js

            throw new Error(‘No Base64 Encode’);

        };

    }

    if (typeof String.prototype.base64Decode == ‘undefined’) {

        String.prototype.base64Decode = function() {

            if (typeof atob != ‘undefined’) return atob(this); // browser

            if (typeof Buffer != ‘undefined’) return new Buffer(this, ‘base64’).toString(‘utf8’); // Node.js

            throw new Error(‘No Base64 Decode’);

        };

    }

在浏览器环境,使用了 btoa / atob的组合,没毛病。在微信开发者工具之前的版本,应该是使用了 Buffer。现在的新版本,我跟了一下,微信开发者工具的js环境中,不存在 btoa,但是存在 atob,导致 btoa和Buffer组合使用了,所以base64Decode出来的结果就已经错了。

那么这个问题,官方是否要处理一下呢?

回到顶部