物联网云平台加密、证书的那些事
不可逆加密
顾名思义,不可逆加密就是说把明文加密之后得到密文,但是不能从密文还原得到明文。从术语上来说,一般不把这个加密结果称作密文,而是称作摘要或者指纹。
不可逆加密原理:把一个任意大小的数据,经过一定的算法,转换成规定长度的输出。如果数据的内容发生了一丝丝的变化,再次加密就得到另一个不同的结果,而且是大不相同。从这个角度看,是不是称作指纹更形象一些?
不可逆加密最常用的算法就是:MD5、SHA1。
回想一下:我们在下载一些软件的时候,在服务器上除了看到软件的下载地址,一般还会看到该软件的MD5码。我们把软件下载到本地之后,计算得到MD5,也就是文件的指纹,然后把这个MD5与服务器上公布的MD5进行比较,如果这两个MD5不一致,就说明下载的文件被别人修改过。
这是glib库的下载页面:
补充:SHA相关知识
SHA
SHA安全哈希算法,由美国国家标准技术研究院发布的一组加密函数。它是一种常用的摘要算法,就是输入一段数据,输出合法的证书一个摘要信息,包括SHA0、SHA1、SHA2等不同的版本。SHA1
代表安全哈希算法1,接收输入,输出一个160位的哈希值,称作信息摘要。在2005年之后,SHA1被认为不安全。SHA2
SHA2指的是具有两个不同块大小的相似哈希函数的族,其中包括:SHA256,SHA512。SHA256可以输出一个256位的哈希值,安全级别更高。
一个实际的使用场景:OTA升级
首先服务器推送一个upgrate.json格式字符串给设备,文件中包括:新固件的下载地址URL,新固件的MD5值;设备根据URL下载新固件到本地;设备计算下载的新固件MD5值,与upgrade.json中的MD5值进行比较;如果这两个MD5值一致,说明下载的固件没有问题,那么就开始升级。
再来了解一下不可逆加密的特点:
不可逆:除非使用穷举等手段,原则上不存在根据密文推断出原文的算法;雪崩效应:对输入数据敏感,原始数据的极小改动会造成输出指纹的巨大差异;防碰撞:很难找到两段不同的数据,输出相同的指纹。公钥和私钥
上面说到了非对称加密,那么就必须再补充一下私钥和公钥。从字面上就可以看出:它俩是一对兄弟,都是秘钥,必须成对使用,称作:秘钥对。我们可以通过一些软件工具(例如:OpenSSL)生成自己的公钥和私钥。
公钥:就是公开告诉别人的;私钥:就是自己的,作为宝贝一样自己私藏起来,千万不要告诉别人。
公钥和私钥的作用有2个:
数据加密:公钥加密,私钥解密,用于通信场景;数字签名:私钥加密,公钥解密,用于不可耍赖场景。
数据加密就是上面描述的非对称加密,例如:
张三想发一个文件给我,为了防止文件被其他人看到,于是张三用我的公钥对文件进行加密,然后把加密后的文件发给我。我拿到密文后,用我的私钥就可以把密文还原成原始的文件,其他人即使拿到了密文,但是没有我的私钥,就解不开文件。如下面这张图:
数字签名与我们日常生活中的借条上的签名类似,一旦签名了,就具有法律效力,不能耍赖说:这个不是我签名,我不认。具体流程是:我写了一个文件,然后用我的私钥对文件进行加密,那么如果以后我耍赖说:这个文件不是我写的,其他人就可以用我的公钥来尝试对加密后的文件进行解密。如果成功解密了,就说明这个文件一定是用我的私钥进行加密的,而私钥只有我才有,那就说明这个文件一定是我写的。如下图:
证书
前面谈到了公钥是公开给别人的,本质上就是一段数据,那么这段数据是以什么样的形式或者说以什么样的载体发送给别人的呢?答案就是:证书。
如何申请证书
我们以一个网站为例,浏览器在访问网站的时候,在握手阶段,网站会把自己的证书发送给浏览器。那么这个证书是如何产生的呢?
Step1
在网站上线之初,需要把自己的相关信息放在一个请求文件中(server.req),把请求文件发送给一个权威的认证机构。请求文件的内容包括:
网站的域名
申请者信息
公钥
以及其他一些相关信息
Step2
认证机构通过其他途径来确定申请者是合法的。
Step3
认证机构使用某个算法,对请求文件server.req中的信息进行计算,得到一个数字摘要。
算法包括:
MD5
SHA-1
SHA-256
信息包括:
申请者的基本信息:网站使用的加密算法、网站使用的hash算法;
申请者的公钥;
认证机构的信息:认证机构的名称,证书到期时间。
Step4
认证机构用自己的私钥,对Step3中得到的数字摘要进行加密,得到数字签名(也就证书签名)。
Step5
认证机构把以上这些信息进行汇总,得到最终的证书文件server.crt,然后发给申请者。
最终,证书server.crt中的内容包括这几个大类:
申请者的基本信息:网站使用的加密算法、网站使用的hash算法;申请者的公钥;认证机构的信息:认证机构的名称,证书到期时间。认证机构的证书签名。如何确认证书的合法性
现在,客户端拿到了服务器发来的证书文件,应该如何验证这是一个合法的证书呢?
Step1
读取证书中的明文信息,包括:申请者的基本信息,申请者的公钥,认证机构的信息。
Step2
从浏览器或者操作系统中查找这个认证机构的相关信息,得到这个认证机构的公钥。
补充:浏览器或者操作系统中,一般都会预装一些可信任的权威认证机构的证书列表,所以能拿到认证机构的公钥。
Step3
使用认证机构相同的算法,对Step1中的明文信息进行计算,得到摘要1。
Step4
使用认证机构的公钥,对证书中认证机构的数字签名进行解密,得到摘要2。
Step5
比较摘要1与摘要2是否相同,如果相同,说明这个证书是合法的,也就证明当前访问的是一个合法的服务器。
单向认证和双向认证
上面描述的认证过程,是浏览器用来确认所访问的网站是否是一个合法的网站;文章开头所举的例子:一个物联网产品在连接云平台的时候,是云平台来验证这个想连接进来的设备是否为一个合法的设备。
这两个场景中都是单向认证,也就是通信的一方来验证另一方是否合法。那么双向认证就很好理解了:通信的每一方都要认证对方是否合法。
至于如何选择使用单向认证或者双向认证,甚至是不使用证书(只使用用户名和密码来鉴权),这就需要根据实际的使用场景、安全等级、操作的难易程度来决定了。比如:在物联网产品中,每一个产品都需要在生产阶段把动态生成的证书烧写到设备中,增加了生产环节的流程和成本,为了安全性,万万不可偷懒。如果没有证书来验证,那么黑客就可以模拟无数个设备,频繁的连接到云平台,这就存在极大的安全隐患。
认证机构
证书本质上就是一个文件,只不过这个文件具有特殊的一个性质:可以被证明是合法的。那么应该如何来证明呢?这就要来说一下认证机构。
认证机构(CA: Certificate Authority)是一个权威的组织,是被国家、行业认可的权威结构,不是随便一个机构都有资格颁发证书,不然也不叫做权威机构。只要能证明一个证书是由CA机构颁发的,我们就认为这个证书是合法的,也就是说:证书的可信任性基于信任机制。
就像银行贷款给个人一样,银行在放款之前,会到征信系统中查询这个人的信用报告,如果征信系统中表明这个人的信用没有问题,银行相信征信系统,所以银行就相信这个人,可以贷款给他,这是一个信任链的传递。
CA认证机构就类似于征信系统,相当于CA结构给证书进行了背书,它保证从它手里颁发的证书都是合法有效的,那么我们只要能证明证书是从CA认证机构颁发的,就可以认为证书是有效的。
证书链
CA认证机构是一个树状的结构,最顶部的称为根认证机构。往下层是:二级认证机构、三级认证机构...。
根认证机构给二级认证机构颁发证书,二级认证机构给三级认证结构颁发证书...。不同等级的认证机构对审核的要求也不一样,于是证书也分为免费的、便宜的和贵的。
你可能会问:那么根认证机构的证书是由谁签名的?答案是:根认证机构自己签名的,这也叫做自签名。因为根认证机构是由国家或者行业组织认可的,已经是一个可以信赖的权威机构,所以可以为自己签名。
另外,我们在测试的过程中,也常常利用OpenSSL中提供的程序来产生自签名的证书,当然,这个测试的自签名证书只能你自己玩,因为别人不信任你。
证书文件的后缀名
刚接触到证书概念的小伙伴,常常被眼花缭乱的后缀名所迷惑。
首先要明确一点:证书文件的后缀名只是为了见名识意,实际上可以取任意的名字。常见的后缀名包括:
.crt:per格式的证书
.der: der格式的证书
.key:pem格式的私钥
.pub:pem格式的公钥
.req:申请证书时发送给CA认证机构的请求文件
.csr:也表示请求文件
证书文件的格式
所有证书内容格式有两种:pem格式和der格式,这两种格式的证书文件可以相互转换,利用OpenSSL中的程序就可以完成。
PEM格式(Privacy Enhanced Mail)
pem格式的证书内容是经过加密的文本文件,一般是base64格式,可以用记事本来打开一个base64格式的证书,例如下面这个证书文件的内容:
-----BEGIN CERTIFICATE-----
MIIGbzCCBFegAwIBAgIICZftEJ0fB/wwDQYJKoZIhvcNApQELBQAwfDELMAkGA1UE
BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK
DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp
...
Nztr2Isaaz4LpMEo4mGCiGxec5mKr1w8AE9n6D91CvxR5/zL1VU1JCVC7sAtkdki
vnN1/6jEKFJvlUr5/FX04JXeomIjXTI8ciruZ6HIkbtJup1n9Zxvmr9JQcFTsP2c
bRbjaT7JD6MBidAWRCJWClR/5etTZwWwWrRCrzvIHC7WO6rCzwu69a+l7ofCKlWs
y702dmPTKEdEfwhgLx0LxJr/Aw==
-----END CERTIFICATE-----
补充:base64算法就是把原始数据中按照每3个字节进行拆分,3个字节是24bit,然后把24bit分成4组,每组6bit,最后在每个6bit的签名添加2个0,这样得到的4组字节码就可以用ascII码来表示了。
DER格式(Distinguished Encoding Rules)
der格式的证书文件内容是经过加密的二进制数据,也就是说文件内容打开后是乱码。
X.509标准
上面说到证书中包含了必要的信息,那么这些信息在文件中并不是随意摆放的,而是要根据固定的格式来存储,只有这样才能通过软件生成或解析。那么这个固定的格式是由谁来规定的呢?这就是X.509标准与公共秘钥证书。
X.509是一个体系、标准,用来规定一个证书的格式标准,CA认证结构在生成证书的时候,就根据这个标准把每部分信息写入到证书文件中。
X.509包括3个版本:V1, V2和V3。每一个版本中颁发证书时,必须包含下列信息:
版本号:用来区分版本;
系列号:由CA认证机构给每一个证书分配一个唯一的数字编号;
算法签名标识符:用来指定CA认证机构在颁发证书时使用的签名算法;
认证机构:颁发证书的机构唯一名称;
有效期限:证书有效期(开始时间和结束时间);
主题信息:证书持有人的基本信息;
公钥信息:证书持有者的公钥;
认证结构签名:以确保这个证书在颁发之后没有被篡改过;
证书格式
总之:证书的核心功能就是安全的传递公钥!
图片新闻
最新活动更多
-
即日-12.5立即观看>> 松下新能源中国布局:锂一次电池新品介绍
-
12月19日立即报名>> 【线下会议】OFweek 2024(第九届)物联网产业大会
-
精彩回顾立即查看>> 2024 智能家居出海论坛
-
精彩回顾立即查看>> 2024中国国际工业博览会维科网·激光VIP企业展台直播
-
精彩回顾立即查看>> 【产品试用】RSE30/60在线红外热像仪免费试用
-
精彩回顾立即查看>> 2024(第五届)全球数字经济产业大会暨展览会
发表评论
请输入评论内容...
请输入评论/评论长度6~500个字
暂无评论
暂无评论