基于Nodejs的微信消息加密与解密实现概要

微信团队提供了多种语言的示例代码,但不包含Nodejs实现版本。经过大量查证和尝试,我已完成并测试通过,下面说说实现要点。

准备

  • Nodejs为0.12.1版或0.12.2版,当前最新稳定版。
  • 平台支持Windows和Linux。
  • 基于Python版本改写,通过Python的加解密验证及实际部署验证。

关键点

  • 密匙key应当通过Buffer转换为binary字符串。
  • 通过String.fromCharCode获得补位所用的字符,通过charCodeAt判断需要删除的补位字符长度。
  • 设置明文长度时,应通过Buf.writeUInt32BE写入,并转换为binary字符串;读取时,使用Buf.readUInt32BE
  • 加密时,XML原文需通过Buffer转换为binary字符串。
  • 加密使用crypto.createCipheriv,解密使用crypto.Decipheriv;须设置cipher.setAutoPadding(auto_padding=false),否则不能正确加解密。
  • 加密时,输入编码为binary,输出编码为base64
  • 解密时,输入编码为base64,输出编码为utf8
  • 每个中文字符通过Buffer转换后,实际计算长度为3,因此最后分离from_appid时,需便宜行事:P

加密部分代码片段:

try {
     var cipher = crypto.createCipheriv(this.mode, this.key, this.key.slice(0, 16));
     cipher.setAutoPadding(auto_padding=false);
     var crypted = cipher.update(content, 'binary', 'base64') + cipher.final('base64');
     return [ierror.OK, crypted];
} catch (e) {
     console.log(e.stack);
     return  [ierror.EncryptAES_Error, null];
}

解密部分代码片段:

try {
      decipher = crypto.Decipheriv(this.mode, this.key, this.key.slice(0, 16));
      // 使用BASE64对密文进行解码,然后AES-CBC解密
      decipher.setAutoPadding(auto_padding=false);
      plain_text = decipher.update(text, 'base64', 'utf8') + decipher.final('utf8');
} catch (e) {
      console.log(e.stack);
      return [ierror.DecryptAES_Error, null];
}

如有疑问请留言,但不能保证及时回复哦。

转载请注明出处:http://my.oschina.net/u/2324376/blog/397296

你可能感兴趣的:(加密,解密,nodejs,微信消息)