消息加密
msg_encrypt = Base64_Encode( AES_Encrypt[random(16B) + msg_len(4B) + msg + $key] ) AES加密的buf由16个字节的随机字符串、4个字节的msg长度、明文msg和$key组成。其中msg_len为msg的字节数,网络字节序; * $key对于ISV来说,填写对应的suitekey * $key对于普通企业开发,填写企业的Corpid
钉钉要求的加密体是random(16B) + msg_len(4B) + msg + $key,其中msg_len为4字节的msg长度,网络字节序 对这个msg_len我一开始的时候一直没有搞清楚到底是什么,而且对网络字节序这个概念也是很生疏。 经过差不多一两天时间的查找资料,终于搞清楚了msg_len
1 | >\> content = 'sadasdasdasdsaddddddddddddfghasdgaskdhaskjdhalsdhakjsdhakjsdjaksdjkashd' |
中间一堆东西我也不知道是啥了,博客迁移的时候出现问题了
这里我们是使用python 的struct的pack方法进行处理
从参数里面可以看到 >标识的是大端排序,也就是常说的网络字节序 l 参数表示的是长整型,4个字节 因此符合要求的应该是
struct.pack(‘>l’, content)
而这个content是我们的msg的长度,也就是len(content) 经过struct.pack之后得到的结果就是我们需要的四个字节的msg长度,网络字节序
Base64加密出现换行 虽然AES加密已经完成了,但是每次都是签名校验不通过,而且发下在每次生成的base64字符串里面都会有几个\n,一开始复制到输入框里面出现换行,自己并没有注意到这个。 后来想了想,加密处理的结果不应该包含\n的,毕竟解密的时候所有字符都会进行解密的。在看了相关的协议规定之后才发现,base64超过一定的长度是会自己添加换行符的。也就是说我们需要手动把这个换行符删掉,而且并不会对加密结果又任何影响。
result = base64.encodestring(content).replace(‘\n’,’’)
成功解决问题
Json格式问题 在返回数据的时候,使用json.dumps()和不用的效果是差别很大的,因为json.dumps()是会把内容转化为str,然后由接收方进行处理的 下面是两种返回数据,发送方收到的结果
data = {‘data’:’dsa’,’sds’:’dd’}
接收到的效果
{“data”:”dsa”,”sds”:”dd”}