使用eclipse实现阿里云物联网平台数字签名(Signature)(附源代码)
摘要:要实现对基于阿里云物联网平台的设备的控制,就需要调用阿里云的API。这些API不会让我们随意调用,而是有相当严格的审核机制,确保数据的安全。这种机制就是“签名机制”,我们每调用一次可以对硬件进行操作的API,就需要提供一次“数字签名”,阿里云物联网平台对每个接口访问请求的发送者进行身份验证,所以无论使用HTTP还是HTTPS协议提交请求,都需要在请求中包含签名(Signature)信息。阿里云只提供了数字签名的基本知识和一些代码,要想让这些代码跑起来,真正计算出来我们的数字签名,请看本文。
操作环境:win7 x64,eclipse 2021-06 (4.20.0),jdk15.0.1,
目录
1.数字签名基本知识
2.安装eclipse
3.设置java的环境变量
4.设置eclipse工作目录
5.新建Java工程
6.新建阿里云物联网签名类
7.下载并导入依赖包
8.编译运行
提示:本文篇幅较长,适合新手跟着一步步做下来,单纯阅读,可能会显得枯燥。
1.数字签名基本知识
阿里云的数字签名机制文档连接如下,大家可以通过这篇文章学习签名的方法是什么。
签名机制
在摘要中已经提到了数字签名是为了安全,是将需要使用的内容通过某一种加密方式进行加密,然后再进行传输的机制。例如下面的这个URL请求,很长很长,使用等号=
连接编码后的请求参数名和参数值。使用与号&
连接编码后的请求参数。参数排序与步骤a的排序一致。
http://iot.cn-shanghai.aliyuncs.com/?MessageContent=aGVsbG8gd29ybGQ%3D&Action=Pub&Timestamp=2018-07-31T07:43:57Z&SignatureVersion=1.0&ServiceCode=iot&Format=XML&Qos=0&SignatureNonce=432101234567&Version=2018-01-20&AccessKeyId=testid&SignatureMethod=HMAC-SHA1&RegionId=cn-shanghai&ProductKey=12345abcde&TopicFullName=/12345abcde/testdevice/user/get
有一些符号是不能被URL传输的,需要进行变换,例如“/”和“=”等,就需要转换为特定的格式,上面的请求参数会转换成为下面的请求参数,注意,此时还没有加密,只是重新编码。
GET&%2F&AccessKeyId%3Dtestid%26Action%3DPub%26Format%3DXML%26MessageContent%3DaGVsbG93b3JsZA%25253D%26ProductKey%3D12345abcde%26Qos%3D0%26RegionId%3Dcn-shanghai%26ServiceCode%3Diot%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3D432101234567%26SignatureVersion%3D1.0%26Timestamp%3D2018-07-31T07%253A43%253A57Z%26TopicFullName%3D%252F12345abcde%252Ftestdevice%252Fuser%252Fget%26Version%3D2018-01-20
那么加密后的结果是什么呢?一长串字符将转换成为下面的一小串字符。
+WylkkUnfSTNlT7oE9HdjiNT0NM=
得到签名之后,就可以应用到调用阿里云物联网平台的API操作中了,例如
http://iot.cn-shanghai.aliyuncs.com/?MessageContent=aGVsbG8gd29ybGQ%3D&Action=Pub&Timestamp=2018-07-31T07%253A43%253A57Z&SignatureVersion=1.0&ServiceCode=iot&Format=XML&Qos=0&SignatureNonce=432101234567&Version=2018-01-20&AccessKeyId=testid&Signature=%2BWylkkUnfSTNlT7oE9HdjiNT0NM%3D&SignatureMethod=HMAC-SHA1&RegionId=cn-shanghai&ProductKey=12345abcde&TopicFullName=%252F12345abcde%252Ftestdevice%252Fuser%252Fget
看上去比较简单,阿里云物联网平台也提供了参考代码,但是这些代码仅仅复制粘贴到vscode里面,还是无法直接执行的,您要想通过这几个源代码看到自己的数字签名是什么,还有很长很长的路要走。
为了让大家早日写出自己的APP,少走弯路,我使用eclipse调试成功数字签名计算的代码,在这里与大家分享一下。为什么选择eclipse而不是vscode的原因就不多说了,一句话,试出来的。
2.安装eclipse
下载当前版本的eclipse,当您看到这个文章的时候,可能版本又更新了,我目前用的版本是 2021-06 (4.20.0)。
下载连接:https://www.eclipse.org/downloads/
下载的速度跟网速和时段有关,有的时候快一些。下载结束之后,安装即可。推荐默认安装
因为要使用java编程,所以推荐第二种安装。
因为机器上已经安装了jdk,所以推荐默认安装。
安装完毕后就可以启动了
3.设置java的环境变量
花生提示:不要一看到环境变量就头晕,毕竟C是不用环境变量的,这个看上去很复杂。其实很简单。我画个图给大家看。我们知道,Java是一种解释性编程语言,它的运行需要在Java运行环境下才能被一边解释一边执行。在解释的过程中,需要与Java运行环境(虚拟机)不停地交互,需要运行Java的各种命令,而这些命令是由一长串的文件目录等组成的。要想对这些命令进行省略,达到只运行一个单词或者字母的目的,就需要“环境变量”,其实就是告诉操作系统,我调用的这个“单词”其实代表了“一句话”,照办就行。
环境变量需要设置3个,分别是JAVA_HOME,CLASS_PATH和path,具体的操作方式请自行网络学习。
需要注意的是
环境变量设置好后,打开命令行,输入java -version,会输出下图所示的界面。表示环境变量设置成功。如果不设置环境变量,java -version将被很长的一句指令代替。
4.设置eclipse工作目录
初次运行,会提示设置工作目录,自己选择在一个硬盘分区中建立即可,这个目录设置的原则是“好记,好找”。例如我设置的是d:\eclipse_work。
5.新建Java工程
为什么需要新建一个Java工程?是因为单独运行阿里云的源代码运行不了,还需要eclipse强大的自动化工程管理功能提供支持才能成功运行。
首先新建一个project
接着选择java project
为自己的工程起个名字,例如叫做AliyunSignature。
一直选择默认,就新建工程完毕了,起初是有一个module-info.java类,这个类非常重要,我们的依赖包就需要在这个文件里面进行设置。后面再详细介绍。
6.新建阿里云物联网签名类
根据官方文档https://help.aliyun.com/document_detail/30563.html?spm=a2c4g.11186623.6.804.5b863f83S2O8xh
计算数字签名的java类有4个,我们需要将这些类一一新建,将源代码复制过来。
在src文件夹上右键选择新建class。
例如新建Config.java,我们为类起个名字叫做Config,注意这个名字要与文件名字相同。package写了一长串,是规范的用法,对于本文来说,圆点左右都是一个文件夹的名字。
例如com文件夹下有一个文件夹aliyun,aliyun文件夹下有一个iot文件夹。
在阿里云帮助文档中复制源代码
然后粘贴到Config.java相应的位置,注意有所取舍,不能将所有的代码都粘贴过来,因为新建类的时候,eclipse已经为我们把框架搭建好了。我们在这个文件中,需要将自己的accessKey和accessKeySecret两个参数填写进来。
accessKey和accessKeySecret两个参数的获取方法是登陆阿里云物联平台,然后点击头像,选取AccessKey管理选项,再逐步设置。
可以使用账号自身的,也可以使用RAM的,相当于子账号,新建之后会提示密码(accessKeySecret),一定要保存好。
按照相同的方法新建其他3个类。
7.下载并导入依赖包
文章开头讲了我们需要将传输的url字符串进行加密编码,就需要两个依赖包。其中StringUtils包的操作对象是 Java.lang.String 类型的对象,是 JDK 提供的 String 类型操作方法的补充,StringUtils 中一共有130多个方法,并且都是 static 的,所以我们可以这样调用 StringUtils.xxx()。
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
我们要把把无法网络传输的字符,如“/”“=”等转换为可以被读取的字符,这个步骤就需要base64编码。Base64
是网络上最常见的用于传输8Bit字节码
的编码方式之一,Base64就是一种基于64个可打印字符
来表示二进制数据
的方法。Base64可以用作HTTP表单和HTTP GET URL中的参数。这种方法有编码和解码两种操作,网上有很多这方面的例子,可以将一串乱码解读成为一句完整的话。
在eclipse中,我们按照阿里云的官方帮助文档https://help.aliyun.com/document_detail/30563.html?spm=a2c4g.11186623.6.804.5b863f83S2O8xh
将4个java文件复制粘贴后,eclipse就会自动提示我们这些源代码中有错误。错误是导入这两个包失败。所以我们需要手动导入这两个包。
从网络上搜索这两个包的名字是不可以的,因为他们对应的包的名字并不是本来的面目。他们与所需导入的jar包的对应关系如下图所示,分别需要导入的是commons.codec包和commons.lang3包。
下载的途径有很多,可以官方下载,也可以第三方下载,两个包都不大。下载后,请将其放在工程目录下的lib文件夹,如果没有这个文件夹,请自己新建一个。
安装jar包的方法也很简单,在工程名右键选择属性properties,然后点击“Java Build Path”选项,切换到Libraries选项卡,就可以导入了。导入的按钮名称是“Add External JARs”。
安装完的效果如下图所示。
安装完毕之后,并不是说源代码的错误自动消失了,这里有一个关键点,就是还要添加依赖。如下图所示,在import org.apache.commons.codec.binary.Base64还有错误提示,“The type org.apache.commons.binary.Base64 is not accessible”。同时,还自动提供了6种快速修复的方法,这里我们选择倒数第二个选项“Add 'requires commons.codec‘to module-info.java”,这句话就是“自动添加依赖”的意思,添加依赖到哪里呢?到module-info.java。如果您是初学者,自动添加是减少编程错误的唯二方法之一。
自动添加依赖之后的效果如下图所示,在module AliyunSignature中添加了依赖“requires commons.codec”。
同样的方式,添加另外一个包。
添加完两个包之后,自动提示的错误消失,可以编译运行了。
8.编译运行
进行到这里,激动人心的时候就要到了。可以直接点击运行快捷键,在Console区域观察输出结果。
假如我们需要实际计算在阿里云物联网平台注册的设备的签名,就需要将一些信息修改。首先是accessKey和accessKeySecret。
accessKey和accessKeySecret两个参数相当于自己的阿里云物联平台的账号和密码,获取的方式是登陆阿里云,点击自己的头像,然后选择“AccessKey管理”,这样就可以获取两个参数了。如果没有,可以在打开的界面新建一个。注意,首次新建可以看到,要保存好,下次再看就看不到了。
然后需要在main.java填写设备的信息,分别是DeviceName和ProductKey。
修改完这两处之后,就可以运行查看一下效果了。
运行效果如下图。可以看到两种方法计算出来的签名不一样,这个不用担心,因为第一种方法没有修改DeviceName、ProductKey、accessKey和accessKeySecret,第二种方法已经修改为自己的这些市级参数了。
如下图所示,我们看到,第一种方法用的是一串相当长的字符串。而且几个参数没有改为实际设备的参数。与第二种方法相比,这种方法易读性差,所以阿里云也推荐使用第二种方法进行计算。
再看第二种方法,使用map对每一个参数进行分块式设置,明显好很多了。如果自己的设备发生改变,修改相应位置的参数即可。
至此,就完成了eclipse环境下阿里云物联网平台数字签名的程序就调试完毕了。
写的比较啰嗦,力图将每一个细节都讲到,希望能够帮助到大家。
源代码可以通过两种途径获取。
第一种是通过CSDN资源下载,链接是:
https://download.csdn.net/download/youngwah292/20469671
第二种是通过微信索取。
下一篇文章将介绍如何通过android studio制作安卓APP来实现数字签名,移动端实现数字签名,将为您打开一扇全面掌控物联网的大门,敬请期待!
作者长期致力于物联网知识的普及,关注我,带您玩转物联网。
使用eclipse实现阿里云物联网平台数字签名(Signature)(附源代码)相关推荐
- 物联网APP:使用android studio实现阿里云物联网平台数字签名(Signature)(附源代码)
摘要:本文讲解如何在安卓移动端实现阿里云物联网平台数字签名,使用的是android studio编写apk的方式进行,win7 x64系统下实现,文中提供了如何配置android studio的国内镜 ...
- Paho Java Client 连接阿里云物联网平台
Paho Java Client 连接阿里云物联网平台 进入阿里云物联网平台->点击产品->新建 点击设备->添加设备 查看设备证书,复制记录,后面使用 阿里云TCP通信 一机一密. ...
- 阿里云物联网平台测评:以温度报警器开发为例
点此查看 所有教程.项目.源码导航 文章目录 1. 物联网平台概述 2. 阿里云物联网平台的优势 2.1 快速接入 2.2 超高负载能力 2.3 可用性 2.4 安全性 2.5 性价比 3. 温度报警 ...
- 物联网平台搭建的全过程介绍(五)——基于阿里云物联网平台的Android聊天app源码
本例程Android源码请点此处免费下载 物联网平台搭建的全过程介绍(四)两台设备之间通过云数据流转实现远程通信之Android studio例程中介绍了两台Android设备通过物联网平台进行通信的 ...
- 使用arduino D1 wifi模块(WeMos D1)连接阿里云物联网平台并成功实现APP点亮板载LED(五)---MQTT.fx模拟设备连接阿里云
前文提到,物联网设备在阿里云物联网平台登记了"身份证"之后,阿里云物联网平台上的设备就处于"未激活""离线"或者"在线" ...
- 001-STM32+Air724UG(4G模组)基本控制篇(阿里云物联网平台)-使用MQTT接入阿里云物联网平台
前言 这节测试下使用STM32+Air724UG 和 Android 和 微信小程序 和 网页端 接入阿里云物联网平台 当前的各种物联网平台整体思想是提供一个网页端让用户去注册设备 这个设备就对应一个 ...
- 阿里云物联网平台python开发手册_阿里云物联网平台体验(树莓派+Python篇)
虽然对阿里云物联网平台比较熟悉了,从一开始就有幸参与了飞凤平台(Link Develop 一站式开发平台的前身)的一些偏硬件接入的工作.但是同时也见证了阿里云物联网团队从几十人到数百人的迅速扩张,其物 ...
- http发送16进制报文_阿里云物联网平台使用心得(25)MQTT协议详解UNSUBSCRIBE报文...
题目 大家好,超子又和大家见面了,超子我能力有限,水平不高,有什么错误的地方,欢迎板砖.超子今天给大家介绍一下UNSUBSCRIBE报文. UNSUBSCRIBE报文 从上图中可知,UNSUBSCRI ...
- 阿里云物联网平台专题讲座
2019独角兽企业重金招聘Python工程师标准>>> 课程链接:阿里云物联网平台专题讲座 课程介绍 物联网平台是阿里云专门为物联网领域的开发人员推出的,其目的是帮助开发者搭建安全性 ...
最新文章
- AI视频行为分析系统项目复盘——技术篇4:deepsort原理图
- hdu 4311 Meeting point-1
- Java多线程发展简史
- 解决Wamp 开启vhost localhost 提示 403 Forbbiden 的问题!
- python yield 详解
- 做为技术人员为什么要写博客?
- 北大保送、硕博连读!《西游记》红孩儿扮演者现成中科院博士!
- 多年前的树莓派 B+ 重新工作
- 密码学专题 OpenSSL标准转换指令
- VB 全局热键HOOK (不占系统资源版本)
- java 文件解签加签_将更改的文件移到另一个分支进行签入
- 我也发个图 娱乐一下
- adc0808模数转换实验报告_adc0808模数转换电路图及程序
- 【电赛最全备赛资源】电赛历年赛题源码+老学长挥泪经验之谈(文章较长全网最全)+电赛论文写作模板及评分标准【19电磁炮、17板球、15风力摆、13倒立摆、94-21全国大学生电子设计竞赛历年真题】
- 阿里云短信通道被人恶意刷了几万条短信,怎么办?(短信接口被盗刷系列3)
- 4D领导力打造卓越团队
- 【论文笔记--FORCE】Progressive Skeletonization: Trimming more fat from a networkat initialization
- 我的世界基岩版红石教程(超简单)2
- html去除页面的滑动条
- 微信小程序ocr身份证扫描
热门文章
- 做计算机项目的流程图,软件工程实验三(程序流程图和PAD图)
- gtk如何修改combobox的下拉箭头_如何管理你的思维导图?
- 北理计算机优营会被鸽吗,被放鸽子以后~
- 数据分析细数周杰伦不能说的秘密
- 东财《金融法X》综合作业
- 无涯教程 - Latex 格式(Format)
- c语言蚂蚁搬,关于蚂蚁搬食的作文
- nuxt解决首屏加载慢问题_Vue首屏加载慢
- mysql hash索引 btree索引_HASH索引做等值查询会很快,BTree索引做范围查询比较快...
- [bigdata] 基于docker 打开hadoop