收藏
回答

encryptjs 这个加密库在微信开发者工具里面不能使用了


之前一直能正常用的,最近升级了一下开发者工具,升级到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:



最后一次编辑于  2018-05-21
回答关注问题邀请回答
收藏

1 个回答

  • happyfire
    happyfire
    2018-05-21

    自己跟了一下,找到问题了,在 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出来的结果就已经错了。

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

    2018-05-21
    赞同
    回复 1
    • 小程序技术专员-june
      小程序技术专员-june
      2018-05-21
      已知问题,后续版本会修复btoa缺失的问题。
      2018-05-21
      回复