之前一直能正常用的,最近升级了一下开发者工具,升级到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:
自己跟了一下,找到问题了,在 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出来的结果就已经错了。
那么这个问题,官方是否要处理一下呢?