为了验证调用者的合法性,钉钉在回调url中增加了消息签名,以参数signature标识,企业需要验证此参数的正确性后再解密。
验证步骤:
企业计算签名:dev_msg_signature=sha1(sort(token、timestamp、nonce、msg_encrypt))。sort的含义是将参数按照字母字典排序,然后从小到大拼接成一个字符串
比较dev_msg_signature和回调接口中推送的字段signature是否相等,相等则表示验证通过
加解密方案说明
开启回调模式时,有以下术语需要了解:
signature是签名,用于验证调用者的合法性。具体算法见以下’消息体签名’章节
EncodingAESKey:注册套件提供的数据加密密钥。用于消息体的加密,长度固定为43个字符,从a-z, A-Z, 0-9共62个字符中选取,是AESKey的Base64编码。解码后即为32字节长的AESKey
AESKey=Base64_Decode(EncodingAESKey + “=”),是AES算法的密钥,长度为32字节。AES采用CBC模式,数据采用PKCS#7填充;IV初始向量大小为16字节,取AESKey前16字节。具体详见:http://tools.ietf.org/html/rfc2315
msg为消息体明文,格式为JSON
钉钉服务器会把msg消息体明文编码成encrypt,encrypt = Base64_Encode(AES_Encrypt[random(16B) + msg_len(4B) + msg + $key]),是对明文消息msg加密处理后的Base64编码。其中random为16字节的随机字符串;msg_len为4字节的msg长度,网络字节序;msg为消息体明文;$key对于ISV开发来说,填写对应的suitekey,$key对于普通企业开发,填写企业的Corpid。
最终传给回调者的是encrypt,字段名为encrypt。
对明文msg加密的过程如下:
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
对应于加密方案,解密方案如下:
取出返回的JSON中的encrypt字段。
对密文BASE64解码:aes_msg=Base64_Decode(encrypt)
使用AESKey做AES解密:rand_msg=AES_Decrypt(aes_msg)
验证解密后$key、msg_len
去掉rand_msg头部的16个随机字节,4个字节的msg_len,和尾部的$CorpID即为最终的消息体原文msg
验证步骤:
企业计算签名:dev_msg_signature=sha1(sort(token、timestamp、nonce、msg_encrypt))。sort的含义是将参数按照字母字典排序,然后从小到大拼接成一个字符串
比较dev_msg_signature和回调接口中推送的字段signature是否相等,相等则表示验证通过
加解密方案说明
开启回调模式时,有以下术语需要了解:
signature是签名,用于验证调用者的合法性。具体算法见以下’消息体签名’章节
EncodingAESKey:注册套件提供的数据加密密钥。用于消息体的加密,长度固定为43个字符,从a-z, A-Z, 0-9共62个字符中选取,是AESKey的Base64编码。解码后即为32字节长的AESKey
AESKey=Base64_Decode(EncodingAESKey + “=”),是AES算法的密钥,长度为32字节。AES采用CBC模式,数据采用PKCS#7填充;IV初始向量大小为16字节,取AESKey前16字节。具体详见:http://tools.ietf.org/html/rfc2315
msg为消息体明文,格式为JSON
钉钉服务器会把msg消息体明文编码成encrypt,encrypt = Base64_Encode(AES_Encrypt[random(16B) + msg_len(4B) + msg + $key]),是对明文消息msg加密处理后的Base64编码。其中random为16字节的随机字符串;msg_len为4字节的msg长度,网络字节序;msg为消息体明文;$key对于ISV开发来说,填写对应的suitekey,$key对于普通企业开发,填写企业的Corpid。
最终传给回调者的是encrypt,字段名为encrypt。
对明文msg加密的过程如下:
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
对应于加密方案,解密方案如下:
取出返回的JSON中的encrypt字段。
对密文BASE64解码:aes_msg=Base64_Decode(encrypt)
使用AESKey做AES解密:rand_msg=AES_Decrypt(aes_msg)
验证解密后$key、msg_len
去掉rand_msg头部的16个随机字节,4个字节的msg_len,和尾部的$CorpID即为最终的消息体原文msg