https基础 - 关于签名证书CA的那些事
“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第2篇文章,点击查看活动详情”
前言
- 本篇属于理论知识篇,适合于所有人进行学习。
- 本篇属于基础入门,如果您是大神,可以快速划过。
- 本篇的内润循序渐进,跳跃可能会影响阅读体验。
- 相信你看完本篇,会有一些不一样的认识。
话不多说;
So,let's start tossing!
本文总字数
2510
字,预计阅读需要花费9
分钟。
背景
在搭建https的环境中,经常会看到一些名词,例如签名、认证、密钥、证书这类的名词,一时半会儿晕头转向,好像知道它在说些什么,但是又好像什么也不知道。
这些盲区好像拦路石一样,阻碍我们前进的步伐,如果你也跟博主一样有这样的困惑,那么就跟着步伐,一起去探索网络世界的奥妙吧!
知识储备
CIA Triad/信息安全三要素
- 保密性(Confidentiality):信息在传输时不被泄露
- 完整性(Integrity):信息在传输时不被篡改
- 有效性(Availability):信息的使用者是合法的
我们在研究一项技术的时候(例如:签名),设法把它带入到这个CIA的模型中,就会更好的理解这项技术的设计初衷。
消息需要保密安全,那怎么实现呢?当然是加密和解密了。毕竟一切关于安全的问题,本质上都是加密和解密的事情。拆分下来就是:
- 如何加密如何解密(加密算法)
- 谁来加密和谁来解密(有效性)
- 怎么保证解密后的是加密前的(完整性)
- ......
一切安全的基础 - 加密算法
常见的加密算法,根据其算法的特征,主要分为两类:对称加密和非对称加密。
对称加密
对称加密 = 单钥加密 = 单密钥加密
算法特征
- 加密方和解密方使用同一个密钥
- 加密解密的速度比较快,适合数据比较长时的使用,也适合消息发送方有大量数据需要加密的场景
- 密钥传输的过程不安全,且容易被破解,密钥管理也比较麻烦,密钥丢失后会造成很大的麻烦
非对称加密
非对称加密 = 双钥加密 = 公私钥
算法特征
- 公钥和私钥总是成对出现的
- 公钥可以解开用私钥的加密的消息,反之也成立
- 公钥/私钥不能通过自己来解密自己加密过的消息(私钥本身持有公钥)
- 公钥和私钥是成对的,并没有明确的定义,你选择公开哪个,哪个就是公钥
- 公钥和私钥无法互相推出,(私钥无法导出公钥,之所以“可以”,是因为私钥文件里面顺便保存了公钥信息)
DES/AES/RSA
DES和AES是常见的对称加密的算法
RSA是经典的非对称加密算法
非对称加密的应用
由于非对称加密的特性,导致其在安全的领域内大放异彩。
其最主要的特性就是其私钥只有一份,其他任何人都不能获取到,拥有这个私钥,就可以成为其身份的象征,其他任何人都无法冒充。利用这个独特的性质,就可以产生一些奇妙的应用,例如下面的两个方面:
加密通信
由于通信的特征,导致非对称加密在通信领域中的实现原理较为简单,如下。
提示一下,这是一个思想实验,如果您看起来比较绕的话,建议您拿着纸笔画一画。
我们假设有A和B两个角色,需要进行通信,其中消息的流向是 A --> B,我们来模拟一下非对称加密算法在加密通信中的应用。
Step 1: 准备阶段
B生成来一个密钥对,其中公钥为x,私钥为y。
A持有B的公钥x。
Step 2:消息加密阶段
A利用公钥x对消息m进行加密,生成来加密消息m‘
即:x + m = m’
Step 3:消息解密阶段
B利用私钥y对消息m‘进行解密
即: y + m' = m
Step 4:其他人C尝试解密
由于C持有公钥x,m'是有x加密而来,不能再次使用x进行解密,所以这个消息C是无法破解的。
即:x + m‘ ≠ m
这样就完成了一次单向通信中的加密过程。 这个特性利用了只有一方持有私钥,那么发送方将消息利用持有方的公钥进行加密,就确定了这个消息的两个方面:
- 这个消息明确了接收方,其他任何人都无法接收到这一条消息
- 这个消息是具有保密性的,因为除了持有私钥的那一方,其他任何角色都无法对消息进行解密。
总结下来就是:利用公钥加密,私钥解密,就可以实现加密通信。
数字签名
或许你在想,那么我使用私钥加密,使用公钥进行解密,这样会有什么使用场景吗?
我们可以想一下,非对称加密的特征,在想一想场景,是不是有一些眉目了呢!
无论如何,是消息的发送方进行加密,消息的接收方进行解密,私钥唯一,而公钥不唯一。
让我们带入到加密通信
的章节里进行对比分析:
公钥加密,私钥解密 | 私钥加密,公钥解密 | |
---|---|---|
发送方 | 能唯一确定接收方 | 能唯一确定发送方 |
接收方 | 只有接收方能解密,消息的保密性得到保证 | 任何人都能解密,保密性不行 |
那么有什么场景下是适用这种模式呢?
也可以换一个问法,那种类型的消息能确定来源,而且任何人都能读到,对公众开放?
那么就是元信息
。
在互联网的场景下,这个元信息随着消息一起发送,接收方对元消息进行解密,校验。
我们称这个元消息为数字签名
。
具体数字签名是怎么设计的呢?
为了理解清晰,以下忽略了加密通信的过程,实际上通信过程中使用了双向加密,即A,B双方各持有对方的公钥,消息传递过程中也会重复
加密通信
的流程。
假设 A --> B,消息为m的场景:
Step 1:签名阶段
A:
`m` -hash函数处理-> `m‘(摘要)`
`m‘(摘要)`-A的私钥->` m''(签名)`
Step 2: 传输阶段
传输过程中传输两部分
分别是原消息`m`和`m‘’(签名)`
Step 3: 验证阶段
B:
` m''(签名)` -A的公钥-> `m‘(摘要)`
`m` -hash函数处理-> `m‘(摘要)`
如果两步骤的m‘(摘要)
是相同的,则说明
- 消息是完整的,因为两次hash后得到的结果是相同的
- 消息是A发送的,因为只有A的公钥才能解密
m''(签名)
所以,数字签名解决了CIP中的I(完整性)和P(有效性)。
加密通信配合数字证书就可以解决大部分的安全问题。
问题
什么是单向认证,什么是双向认证
在通信领域中,有可能B只需要接受消息,而不用主动的发送消息,那么这个过程就是单向认证。
角色B自身不生成密钥对,持有其他角色的公钥,从而被动的接受其他角色发来的消息,这种流程就是单向认证。
如果B也需要发送消息,那么B也需要生成密钥对,持有自己的私钥,而把公钥广播出去。这种的通信就是双向认证。
什么是数字签名,为什么需要数字签名
数字签名本质上就是 消息体m hash处理成为摘要,然后将摘要使用消息发送发的私钥进行加密后的产物。
主要是为了解决消息的完整性和有效性的校验,代表了这个消息是由A发出,具有可信度。
为什么说公钥加密,私钥签名
公钥加密是为了加密通信,解决了CIA模型中的保密性;
私钥签名是为了确定消息的完整性和有效性。
什么是数字证书,为什么需要数字证书
数字证书简称CA,它由权威机构给某网站颁发的一种认可凭证。
数字证书的颁发流程
有一个顶级机构root,它有自己的公钥和私钥。
Step 1: 申请阶段
A:
A的公钥 + A的一些信息(例如域名) 发送给 root
Step 2: 颁发阶段
root:
A的公钥 + A的一些信息(例如域名) + -root的私钥-> 中间体 + 签名 = A的证书
数字证书的使用流程
Step 1: A,B的通信阶段
A 消息m + 签名m‘ + 数字证书ca 发送给 B
Step 2: B的验证阶段
A证书ca = root的签名 + 证书内容
root的签名 + root的公钥 --> 验证证书的有效性和完整性
root的签名 + 证书内容 --> A的公钥 + A的一些信息(例如域名)
对A的消息进行比对(例如域名)
这个就完成了数字证书的整个流程。
为什么需要数字证书
中间人攻击:
在加密通信和数字签名的过程中,很有可能存在中间人攻击的状况,具体的就是 A <-> B <-> C这样的通信链路, A的消息先发送给B,B在发送给C,反过来也是一样, A和C都不知道对方的存在,他们都只知道B的存在。
B在建立连接的时候对连接进行拦截,形成了中间人攻击。 B就会看到所有的消息。所以需要数字证书对通信的对方进行置信。 后续详细会有文章详细的介绍一下中间人攻击。
参考
转载自:https://juejin.cn/post/7143915445530132487