天天看点

0宽字符加密_阿里云物联网平台,网络通信CoAP协议上传数据,AES加密构建报文...

0宽字符加密_阿里云物联网平台,网络通信CoAP协议上传数据,AES加密构建报文...

题目

大家好,超子说物联网又和大家见面了,超子我能力有限,水平不高,有什么错误的地方,欢迎板砖。上一篇文章中,我们构建好了认证报文,并且发送给阿里云后,得到了阿里云提供的3个重要信息random、 seqOffset和token。接下来我们一起来构建上传温湿度数据的报文。

0宽字符加密_阿里云物联网平台,网络通信CoAP协议上传数据,AES加密构建报文...

我们先看报文的头4个字节,上传温湿度数据的报文也是需要CON报文的POST方法。所以前4个字节和认证报文时是一样的 ,只是我们要换一个Message ID,累加1即可,用0x01 0x02。然后16进制,简化书写,去掉0x结果如下:

40 02 01 02

0宽字符加密_阿里云物联网平台,网络通信CoAP协议上传数据,AES加密构建报文...

上图是阿里云要求的上传数据的报文需要设置的options参数,这5个是CoAP协议中标准的参数,除了这5个标准的参数需要设置外,阿里云还要求我们上传两个阿里云自己定义的options参数,NO.编号分别是2088和2089。这两个参数的编号比较大,我们一会要着重注意累加值如何计算。

我们先看5个标准的参数,其中Host、Port、Accept和Content-Format和第1步认证报文的要求一样,没有任何区别。所以我们就不用重新构建了,直接把前面的复制过来就行。然后就剩下URL了,它的值变了,和认证报文中的不一样了。

0宽字符加密_阿里云物联网平台,网络通信CoAP协议上传数据,AES加密构建报文...

我们需要打开设备详情页面,如上图所示,找到属性上报的Topic。按阿里云的要求,Topic字符串前需要加上一个前缀/topic,所以最终的URL结果如下所示:

/topic/sys/a12dTIroTJC/D001/thing/event/property/post

构建第1步认证报文URL的时候,超子说过,/ 符号不能包含到数据报文中 ,上面的URL中有很多个 / 符号,这些个 / 符号都不能加入报文中去,所以上传数据报文的URL要分段,结果如下:

topic

sys

a12dTIroTJC

D001

thing

event

property

post

一共是8段,每一段分别构建,这一点一定要注意。URL需要在Port参数之上再累加4,所以是0x4?,第1段是topic,5个字节,所以?号是5,然后再把topic换成16进制,简化书写,去掉0x的结果如下:

45 74 6F 70 69 63

然后第2段是sys,因为我们现在还是设置的URL,只是不同的段,所以累加值就是0,也就是0x0?,第2段sys长度3个字节,?号就是3,再把sys换成16进制,简化书写,去掉0x的结果如下:

03 73 79 73

然后还剩6个段,但是原理大家应该都清楚了,因为都是URL,所以累加值就是0,然后我们把6个段全部构建,16进制,简化书写,去掉0x的结果如下:

a12dTIroTJC:0B 61 31 32 64 54 49 72 6F 54 4A 43

D001:04 44 30 30 31

thing:05 74 68 69 6E 67

event:05 65 76 65 6E 74

property :08 70 72 6F 70 65 72 74 79

post:04 70 6F 73 74

最后整个URL,16进制,简化书写,去掉0x的结果如下:

45 74 6F 70 69 63 03 73 79 73 0B 61 31 32 64 54 49 72 6F 54 4A 43 04 44 30 30 31 05 74 68 69 6E 67 05 65 76 65 6E 74 08 70 72 6F 70 65 72 74 79 04 70 6F 73 74

以上5个标准的options参数都搞定了,接下来就要构建阿里云自己要求的2个options参数了,它们分别是:

NO.编号2088的,token令牌

NO.编号2089的,seqOffset的AES加密

0宽字符加密_阿里云物联网平台,网络通信CoAP协议上传数据,AES加密构建报文...

我们先看NO.编号2088的token如何构建,token的内容是第1步认证时,阿里云提供的,从网络调试助手中复制下来

w8xMOLr5TCunKVddshmQ000100.6120

接下来我们着重看2088的累加值怎么算,5个标准参数中最后一个Accept的NO.编号是17,所以2088-17=2071,如此一来,我们设置NO.编号2088的token就需要累加2071。参数的累加值也是使用变长的方法,和我们设置参数具体内容的变长算法一样。也是要遵循那3种情况。超子在《阿里云物联网平台使用心得(38)CoAP协议之构建认证报文步骤1》这篇文章总介绍过了,如果大家忘了,可以返回去再看一下。这次的增量是2071,所以属于第3种情况,所以首先是0xE?,?号是token长度,我们一会再说,先把2071增量搞定。因为是第3种情况,2071-269=1802 ,然后把1802换成16进制就是0x07 0x0A,最后就是0xE? 0x07 0x0A。然后再看token的长度是31,属于第2种情况,所以应该是0xED 0x 07 0x0A ,然后31-13=18,再换成16进制,就是0x12,所以结果就是0xED 0x07 0x0A 0x12。一定要注意,对于这种NO.增量和参数具体内容长度都比较长的情况,一定要把NO.增量的字节放在参数设置内容的字节之前。最后再追加上token的字符串,16进制,简化书写,去掉0x的最终结果如下:

ED 07 0A 12 77 38 78 4D 4F 4C 72 35 54 43 75 6E 4B 56 64 64 73 68 6D 51 30 30 30 31 30 30 2E 36 31 32 30

然后再看NO.编号2089的seqOffset的AES加密参数,这个着实比较麻烦,因为需要要进行AES加密,所以超子先总结一下具体步骤 ,如下所示:

(1):构建数据: DeviceSecret,random字符串,逗号不要丢了,random是第1步认证后阿里云回复的,看上图即可

(2):对(1)中构建的数据,进行sha256计算

(3):sha256后的结果,去掉前8个16进制数据,去掉后8个16进制数据,留中间的16个16进制数据作为密钥供下面的步骤使用

(4):AES加密时的初始向量,阿里云提供,16进制,简化书写,去掉0x的结果如下

35 34 33 79 68 6A 79 39 37 61 65 37 66 79 66 67

(5):构建AES加密的明文,第1步认证时阿里云回复的seqoffset值,看上图即可,每次计算AES加密的时候该值累加1作为明文,比如上图中是7,注意这个是字符7,不是16进制的0x07,字符7换成16进制的话是0x37,如果累加到10了呢,那就要分开表示,字符1是0x31,字符0是0x30,所以明文就是两个字节0x31 0x30,那要是100了呢,那明文就是3个字节0x31 0x30 0x30。

(6):AES加密的后的数据,就是NO.编号2089参数的具体内容,一般是16个字节。

我们接下来一步一步的走,先看第(1)步,DeviceSecret,random结果如下,不要把逗号丢了:

jBiRd3INpmL0zrb8XgURzP6JJOmFWMdJ,b216dd2b0c40ac37

0宽字符加密_阿里云物联网平台,网络通信CoAP协议上传数据,AES加密构建报文...

然后第(2)步,是对第(1)步的结果进行sha256计算,注意上图sha256计算结果的格式是16进制,简化去掉0x并且把空格也简化了,我们复制下来,结果如下:

66c3ce2ab9886f2c31c2828ec0546efef2428c12e8a37e490d6afbf8f449f006

接着第(3)步,把第(2)步的结果掐头去尾,留中间16个16进制数。简化书写,去掉空格和0x,结果如下:

31c2828ec0546efef2428c12e8a37e49

这个就是稍后要进行的AES加密的秘钥。

0宽字符加密_阿里云物联网平台,网络通信CoAP协议上传数据,AES加密构建报文...

第(4)步是构建AES加密时的初始向量,这个是阿里云提供的,不用我们自己构建,看上图,我们把初始向量换成16进制,简化书写,去掉0x和空格,结果如下:

35343379686A79393761653766796667

第(5)步要构建AES加密时的明文,明文是第1步认证时阿里云返回的seqoffset值,是字符7,累加1就是字符8,换成16进制就是0x38,也就是AES加密时的明文,比较简单就1个字节。

0宽字符加密_阿里云物联网平台,网络通信CoAP协议上传数据,AES加密构建报文...

我们使用上图中的AES加密工具,文中第6张图中,阿里云给出了加密模式,选择CBC,然后软件中IV就是初始向量,秘钥就是第(3)步中,掐头去尾,留下的16个16进制数据,再看文中第6张图中,阿里云要求,我门勾选上Pad前的对勾,然后选择PKCS5 Padding。然后待加密的明文处输入简化的16进制38,一定注意就是软件里的格式都是16进制简化书写的,没有0x,而且空格也省去了。 最后点击Encrypt,就可以输出结果了 ,如下所示:

FE 2E 8B 1A 67 36 D0 28 99 BD 14 37 3F 92 F5 C6

NO.编号2089只需累加1,所以就是0x1?,?号是AES加密结果的长度,长度是16字节,所以?是D,然后再加一个字节0x03,就可以表示长度16,NO.编号2089的参数报文,16进制,简化书写,去掉0x的结果如下:

1D 03 FE 2E 8B 1A 67 36 D0 28 99 BD 14 37 3F 92 F5 C6

目前为止,上传数据的报文除了payload之外,前面的报文都搞定了,我们总结一下

40 02 01 02 3D 21 61 31 32 64 54 49 72 6F 54 4A 43 2E 63 6F 61 70 2E 63 6E 2D 73 68 61 6E 67 68 61 69 2E 6C 69 6E 6B 2E 61 6C 69 79 75 6E 63 73 2E 63 6F 6D 42 16 32 45 74 6F 70 69 63 03 73 79 73 0B 61 31 32 64 54 49 72 6F 54 4A 43 04 44 30 30 31 05 74 68 69 6E 67 05 65 76 65 6E 74 08 70 72 6F 70 65 72 74 79 04 70 6F 73 74 11 32 51 32 ED 07 0A 12 77 38 78 4D 4F 4C 72 35 54 43 75 6E 4B 56 64 64 73 68 6D 51 30 30 30 31 30 30 2E 36 31 32 30 1D 03 FE 2E 8B 1A 67 36 D0 28 99 BD 14 37 3F 92 F5 C6

接下里我门再看payload,他包含的就是要上传的温湿度数据,数据的格式和使用MQTT协议以及HTTP协议时候的一样,就不多赘述了,改一下具体的数值就行。

{"params":{"CurrentHumidity":56.56,"CurrentTemperature":23.23}}

Payload中上传的数据也要经过AES加密,初始向量以及秘钥都跟构建NO.编号2089的参数是一样的,设置也是一样的,就是把明文改成我们上面的数据,一定得换成16进制后,才能填写到加密软件里。

0宽字符加密_阿里云物联网平台,网络通信CoAP协议上传数据,AES加密构建报文...

我们把Payload中的数据换成16进制,然后填进软件中,点击Encrypt,就可以输出结果了 ,然后我们把payload和前面的报文连接起来,注意加上0xFF,作为分隔符,最终的报文如下:

40 02 01 02 3D 21 61 31 32 64 54 49 72 6F 54 4A 43 2E 63 6F 61 70 2E 63 6E 2D 73 68 61 6E 67 68 61 69 2E 6C 69 6E 6B 2E 61 6C 69 79 75 6E 63 73 2E 63 6F 6D 42 16 32 45 74 6F 70 69 63 03 73 79 73 0B 61 31 32 64 54 49 72 6F 54 4A 43 04 44 30 30 31 05 74 68 69 6E 67 05 65 76 65 6E 74 08 70 72 6F 70 65 72 74 79 04 70 6F 73 74 11 32 51 32 ED 07 0A 12 77 38 78 4D 4F 4C 72 35 54 43 75 6E 4B 56 64 64 73 68 6D 51 30 30 30 31 30 30 2E 36 31 32 30 1D 03 FE 2E 8B 1A 67 36 D0 28 99 BD 14 37 3F 92 F5 C6 FF 93 35 CE 8B C1 60 45 8E 51 61 16 FD F1 52 4D B4 30 77 2C 9B 84 9E 5B FD DB 2D 20 EA 98 13 85 8B D8 2F CF 42 2B 9E 48 33 60 9F BB 09 3E 05 B7 D8 16 A6 B2 B2 26 DF C3 58 8F 0F 13 3E DD EB B0 CC

0宽字符加密_阿里云物联网平台,网络通信CoAP协议上传数据,AES加密构建报文...

我们使用网络调试助手,把上传数据报文发给阿里云,然后打开设备详情页面,可以看到我们的数据已经上传上去了,说明我们的报文构建正确。如果想再次上传数据的时候,一定注意NO.编号2089的参数,进行AES加密时,每次都要把明文的值累加1,千万不要忘了。

到此使用CoAP协议上传数据的方法就介绍完了,阿里云还提供了另一种DTLS的方式对接平台,如果我们使用DTLS的话,就省力多了,因为使用加密通道发送数据,所以就不用我们自己加密了,所以也就没有2089这一项了,数据payload也无需进行AES加密,注意一点就是使用DTLS时,域名一样,但是端口号变成了5684,我们把复杂的自主对称加密都搞定了,相信大家如果使用DTLS时,也能很快的构建起来报文。