Nodejs 微信加密消息开发
来源:互联网 发布:源码下载网站 编辑:程序博客网 时间:2024/06/07 03:02
最近在做微信接入,在采用明文消息与微信服务器进行通信时,毫无压力,改成密文后,微信提供了各种语言版本的demo,but 没有nodejs。(复制一下,语文偏科,凑字数)。
做微信加密消息主要下面几个方面的内容:
加密前明文结构
16字节的随机字符串
消息长度的网络子节序
加密方式
加密算法
填充块计算方式
加密实现
1. 加密前明文结构: random(16B)+ msg_len(4B) + msg + $AppId;
说明:random(16B)为16字节的随机字符串;msg_len为msg长度,占4个字节(网络字节序),$AppId为公众账号的AppId
2. 16字节随机字符串:没啥说的直接拼接就好了
var randomPrefix = function(n) { var _str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'; var buf = new Buffer(n); for (var i = 0; i < n; i++) { buf[i] = _str.charCodeAt(Math.floor(Math.random() * _str.length)); } return buf;};
3. 网络子节序:网络子节序根据消息主体长度而生成
var htonl = function(n) { var buf = new Buffer(4); buf[0] = (n & 0xFF000000) >> 24; buf[1] = (n & 0x00FF0000) >> 16; buf[2] = (n & 0x0000FF00) >> 8; buf[3] = (n & 0x000000FF) >> 0; return buf;};
4.加密方式:Base64_Encode(AES_Encrypt [random(16B)+ msg_len(4B) + msg + $AppId]);
5.加密算法:AES采用CBC模式,秘钥长度为32个字节,数据采用PKCS#7填充;PKCS#7:K为秘钥字节数(采用32),buf为待加密的内容,N为其字节数。Buf需要被填充为K的整数倍。在buf的尾部填充(K-N%K)个字节,每个字节的内容是(K- N%K);
6.填充块计算方式: 消息体长度 /32 ,
var padding = function(n) { var len = n % 32; if (len == 0) { len = 32; } else { len = 32 - len; } var buf = new Buffer(len); for (var i = 0; i < len; i++) { buf[i] = len; } return buf;};
7.加密实现:
1.加密采用crypto库,
2.加密方式:aes-256-cbc,
3.key:
var encodingAESKey = new Buffer("YfWVs4vtcNf6FPFRqzJ2VT6LCmpppePaRyGJjt7Rlcr" + "=", 'base64');
4.IV:
encodingAESKey.slice(0, 16);
5. 创建加密对象方法:createCipheriv,
var cipher = crypto.createCipheriv('aes-256-cbc', encodingAESKey, encodingAESKey.slice(0, 16));
6. 取消自动填充
cipher.setAutoPadding(false);
7.加密并返回结果
cipher.update(Buffer.concat([preBuf, netBuf, msgBuf, corpBuf, paddingBuf]), "binary", 'base64') + cipher.final('base64'); // 解密数据
8.整体加密代码
var encrypt = function(msg) { var msgBuf = new Buffer(msg, "utf-8"), msgBufLength = msgBuf.length, preBuf = randomPrefix(16), netBuf = htonl(msgBufLength), corpBuf = new Buffer(corpId, "utf-8"), corpBufLength = corpBuf.length, paddingBuf = padding(20 + msgBufLength + corpBufLength); var cipher = crypto.createCipheriv('aes-256-cbc', encodingAESKey, encodingAESKey.slice(0, 16)); cipher.setAutoPadding(false); // 取消自动填充 return cipher.update(Buffer.concat([preBuf, netBuf, msgBuf, corpBuf, paddingBuf]), "binary", 'base64') + cipher.final('base64'); // 解密数据};欢迎加入node.js交流群:572416249
原文:http://my.oschina.net/lvyuely/blog/598421
0 0
- Nodejs 微信加密消息开发
- 微信开发消息体的加密解密
- nodejs微信开发测试,模拟微信事件、消息等请求
- nodejs微信公众号开发第三章:自动回复消息简单案例
- 微信消息体加密php版
- 微信公众号开发:消息加密模式 java.security.InvalidKeyException: Illegal key size
- nodejs 微信开发相关,抓取相关
- NodeJS微信公众平台开发
- nodejs微信开发--验证路径token
- nodejs微信开发--自动回复 wechat
- nodejs微信开发--设置自定义菜单
- NodeJs开发微信公众号
- nodejs微信开发(express版)-目录
- Nodejs 开发微信公众号
- nodejs微信公众号开发
- nodejs开发微信公众号支付
- nodejs开发微信公众号
- 微信开发 模板消息
- cocos2d-x 3.x学习之ActionEaseTest
- Css cursor鼠标指针鼠标光标样式
- linux gdb 调试工具
- 【JQuery笔记】animate中的params参数
- matlab C代码生成
- Nodejs 微信加密消息开发
- java迷宫
- debug.keystore
- hdoj 1013 Digital Roots
- Css3 transform matrix()的使用
- Shell Sudo With Password On Command
- 新的Android开发环境——Android Studio
- Android中Activity生命周期测试分析
- oracle学习笔记 Oracle体系结构概述