二维码扫码后得到一个base64编码后的buffer,按base64解码后的二进制数据定义如下:
1 Byte | 1 Byte | 8 Bytes | 4 Bytes | 2 Bytes | 64 Bytes |
---|---|---|---|---|---|
version | type | openvid | start_time | expires_in | sign |
参数说明:
参数名 | 含义 |
---|---|
version | 数据格式版本号,目前固定是0x01 |
type | 签名类型, 0表示是员工, 1表示是访客, 员工二维码固定为 0 |
openvid | 员工id,为64位无符号整数, 仅用于员工二维码签名 |
start_time | 开始时间,unix时间戳(秒) |
expires_in | 有效时长(秒) |
sign | 签名 |
签名算法暂定用椭圆曲线非对称加密算法(ECDSA),选取的椭圆曲线为NID_X9_62_prime256v1。
包体签名:
Sign = ECDSA(SHA256(join(version,type,openvid,start_time,expires_in)))
私钥由企业微信保管,设备使用公钥(全量拉取用户数据或增量拉取用户数据的pub_key)验证即可。
注:
1、 join的含义是将version,type,openvid,start_time,expires_in对应的数值依次拼接在一起。
2、 SHA256,ECDSA分别是一种哈希算法和非对称加密算法,实现方可以根据自己开发语言找一下现有的成熟算法库。
3、验证签名时,先对签名使用公钥解密,随后计算SHA256摘要是否一致。