node解析包括敏感数据在内的完整用户信息的加密数据

134 阅读1分钟

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"
//   }
// }