1、编写工具
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
2、使用
var WXBizDataCrypt = require("./WXBizDataCrypt");
var appId = "wx967f2d718f8ca1ee";
var sessionKey ="fyZzogw/FBJtVUTk/3rK6Q==";
var encryptedData = "4TvtbwXzdb0nQ5lP80Hm8LzJQ8XZC5P1nvA3ECl/MCnhrGQcx0cxJvGtOHTWGaeJ0ZkBY+X/PB1A6EknzmUzPB9CovBd4zr0s3YbZBI/EZmu7JjOCCPmvZsD6O2jZ7kTtzDtP3oSmV8NGGwH+8MaUKJYaIfvJ1yaIvNpQWyMWKBuoJZsHmQiZ5mR5Eg8/2lIQBGGYuY/Ju4Id0hFoogbWUhUqHNIAd43ks4Sc0xoL8W5Jsv+eqxzP3vyrG49O4n8OB/a+4/kpxrTFTtfLkH1wMMwOwq6l4H6POw59jgwdtrv5xqcsiY75pUGyd75myBZnHWtKwhyWcMfeZ7xOKlx7PVJdusacGq8lInMvwA44krIDQe8q4fYTqAt5iFw5q92ltQYER1EqUVqBtSD6a6GpFYBAsmQVoHVN4DGI91kzP6spx3EFV8NWy+8zbpYCKw/w5ecFsrPiQ9r5StCk8QR+ZjLGXojL8nJw21SKvor7Bqlm5B4mFMMxZXFSeGRdkOdiN4R/55Wl78Wqv4WaWH8F3OE/TM7woxtjcNli5sDNNwaw8xTT0wXNFUJZW4UPdkBBDxQUSMeOOog3uxHnm+6HCMGnpehS2PTbeLtVk4Xg0klSfjf/ctTUXVdz1UvM98dO5vE0s0lwrb4yTfKSbVKZOSyRbOTaN4ShTcl+9L1I51dnZnw3enh0r7kgqJDFHEtJK+fToNwod/xBGr0HqcmqC5IiU+YOiUUd2xCn8yZ3G3u7PWTCfp0VenhvfYYQodCR79mhowPFFTXP4Zcrx+ymgRjzD4rnIHUywRMQtPxFcQqd5dMB4yNxNEw1ssTDSuUo/EDweEa91erH4mIA8TSqqTlJ+x2tE9rwamYtotbmVWnW9OgwrAEFOtKeEkQta6J7MKmbwZ6BAohEYT6J6ONj5b4kUZROQpRb1x24AYM88PCFGxhGtYzwv9vjniYBXUqHuH78J5xdxh7Yzza1DvUKqDFthIuQOKTcKDHZ7hY8h7NkV+7pM/Ob/ljVUpBq11XxJfBt0cILGf8RTXBKAReNqednWIINVeLzxGRni0y+kfn1KwB33l1nnrkN8x+OiPEvT9ixODNF/0TvspSSzYgSw6AlQDdzB/l7uDlR4wwFGVh3gGY2RlOwzYdIpUbIJGBHp31vK3kC20xJXuQPtKiy9uMlv0V4/LF4JAlJsrC634d0FeYMhlzwlCn0iSTO5yatMy0Lb6BSZmgK8WS0f4pF0PnscmnX8LJWE8P1WkLTQiJ3TrHicVjFyN5ZmTSXoErbbQudYx1/ASBZG7SmENkRJj5ktX9a2h3lzrxmBrLzpxge2kYV4UEbUZZDWYZvyqfKL34i4olVvQ3QSQfvH9LM76pBVXJG3UsjzMmAepHt2GH9VvC9HKYsn/Yo9oJCxz7JICseCxUycfQEuufFifNPuHBMFK6qzbnL9O+U66DFc/cNgQpzmQw0lMZ8T8GIEztqVQcsWXwNPyxwVBV2vGjtfKCZSukAGLnlDFdO7QBC2rrcDGGzyBpfoPw7OZyBvrlDF5p5NI/OihV/ovfeu8UgOdzVMYdeoJSV/046aCUXKzy0SMEWkUaa/u/1rQzskDVaskc7gk+55niKUx0aD5YRw=="/* */;
var iv ="pOKXM4QceJQht2yF5TSiRg==";
var pc = new WXBizDataCrypt(appId, sessionKey);
var data = pc.decryptData(encryptedData, iv);
console.log("解密后 data: ", data);
// 解密后的数据为
//
// data = {
// "nickName": "Band",
// "gender": 1,
// "language": "zh_CN",
// "city": "Guangzhou",
// "province": "Guangdong",
// "country": "CN",
// "avatarUrl": "http://wx.qlogo.cn/mmopen/vi_32/aSKcBBPpibyKNicHNTMM0qJVh8Kjgiak2AHWr8MHM4WgMEm7GFhsf8OYrySdbvAMvTsw3mo8ibKicsnfN5pRjl1p8HQ/0",
// "unionId": "ocMvos6NjeKLIBqg5Mr9QjxrP1FA",
// "watermark": {
// "timestamp": 1477314187,
// "appid": "wx4f4bc4dec97d474b"
// }
// }