解密encryptedData 出现Illegal Buffer
发布于 6 年前 作者 pengxiuying 10576 次浏览 来自 问答

官方nodejs解密这段代码, __有一定的概率__出现throw new Error(‘Illegal Buffer’)

请问是什么原因,查了很久参数传送没问题。求官方给我回复,在线等,因为上线前遇到这个奇怪问题,见到论坛都有类似的问题 都没有解决的。!!!!!!

相关介绍:https://mp.weixin.qq.com/debug/wxadoc/dev/api/signature.html

提供相关的真实数据方便官方帮忙查找下原因是什么:

var appId = "wxb52dabb4ae6c5e5f";
var sessionKey = "Av/kbm77la18Bo+vDfg9Hw==";
var encryptedData = "wtv8PmAjj/ht48phniECl6DlLjar8OuIC9ghKH6yyNmo6FzHQIKc4/Rf3BkvHdWgT62ogUvxjMkmVFUvOpkKpFMYZ5YFk6Nd3MghV8kdrWLuf5XnoqGLkFhI+LVTkhlbeGF3UQZCIn4N0wfnvbjnWTrdiUaqJRyMz7vh0xggRPL3PHcaIb5oyYrV349xsb4gyzeKPpTRC9ED3o4Yf+SPLExfdiTBnaZ1OaYsdqsVirgh60Z7OxTmXVUAsedbSJZ4z4+nJvbkE/63Twb/a8+64ByPhojwMSsqJru5mLFFIZ+LEf250K+sqfbMhvWnmAYdQLy0ZcSKKqXzFZMmZGa56V5IdRQc8jo4gYVzrhuxbynQghQcjpRYDLDdUUWn5alAg8ruQ6D7uM1qygGbluASixUR59w59UP2QGplgDOXCazC90NB/0ZokvrATObKXpixiUgMu+azL9pEUgCoi1mxaMp47mpl5zyGCAuDoG/54cQ=";
var iv = "7vXKt43CYsQwntPHIImz0Q==";

=================================

var crypto = require('crypto')
function WXBizDataCrypt(appId, sessionKey) {
   this.appId = appId
   this.sessionKey = sessionKey
}
WXBizDataCrypt.prototype.decryptData = function (encryptedData, iv) {
   // base64 decode
   var sessionKey = new Buffer(this.sessionKey, 'base64')
   encryptedData = new Buffer(encryptedData, 'base64')
   iv = new Buffer(iv, 'base64')
   try {
       // 解密
       var decipher = crypto.createDecipheriv('aes-128-cbc', sessionKey, iv)
       // 设置自动 padding 为 true,删除填充补位
       decipher.setAutoPadding(true)
       var decoded = decipher.update(encryptedData, 'binary', 'utf8')
       decoded += decipher.final('utf8')
       decoded = JSON.parse(decoded)
   } catch (err) {
       throw new Error('Illegal Buffer')
   }
   if (decoded.watermark.appid !== this.appId) {
       throw new Error('Illegal Buffer')
   }
   return decoded
}
module.exports = WXBizDataCrypt
10 回复

这个最近频繁出现,官方有工程师可以跟进下,看下官网提供的 nodejs 解密源码是否有 bug 吗?

注意:

在回调中调用 wx.login 登录,可能会刷新登录态。此时服务器使用 code 换取的 sessionKey 不是加密时使用的 sessionKey,导致解密失败。建议开发者提前进行 login;或者在回调中先使用 checkSession 进行登录态检查,避免 login 刷新登录态。


在进入页面时先在onLoad里wx.login code 换到session_key然而存下来,当用户点击获取手机号时,把加密数据连同之前保存的session_key一起传给后端


文档写的很清楚了

https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html

@楼主,请问这个问题是通过什么方案解决的?

楼主,请问最后是如何解决问题的呢, 这边也是偶尔会出现这个问题, 特别是在第一次请求的时候。

先确保login在getUserDetail之前

是不是需要先wx.login,再获取解密数据给后台解密。  如果先获取数据,再获得code,那这个code拿到的sessionkey就不对应上数据了?

demo是有问题的,其中var decoded = decipher.update(encryptedData, ‘binary’, ‘utf8’)

decipher.update的第二个参数没有binary的写法,变为空字符就OK了。。。。。。。。。。。

这样,var decoded = decipher.update(encryptedData, ’ ', ‘utf8’)

回到顶部