相信很多人,对 https 的过程弄不清楚,只是知道 https
是安全加密的,背后的原理,过程并不清楚
笔者曾经也是对 https
的过程并不清楚,一知半解,而且最可气的是每次面试,面试官很可能就问你这个问题
每次都答不对或者答的面试官不满意,说来说去,还是自己没有真正理解
其实 https
的原理过程,并没有那么复杂,只是有些文章没有说清楚,这样的文章看多了,就迷糊了。
在了解 https
原理的过程之前,我们先来了解一下加密的知识
一 加密知识
加密按照加密方式,可以分为以下三种方式
1.1 单向加密
也叫做不可逆加密,对明文的加密产生一个密文,并不能再通过密文,解出来对应的明文
一般用于产生消息摘要,密钥加密等,常见的单向加密有:
- MD5 : 相信这个大家都都熟悉了,一个明文,md5 以后,对应一个唯一的密文
- SHA : 其中又分为 sha192 , sha256
特点:
- 不可逆
- 输入一样,输出必然相同
1.2 对称加密
对称加密,用一个密钥,对明文进行加密,同理,同这把密钥,也可以对密文进行解密
也就是说加密和解密,可以用同一个密钥
这种加密方法就是 对称加密
常用的对称加密方法有:
- DES
- 3DES
- AES
特点:
- 加密方和解密使用同一密钥
- 加密解密的速度比较快
1.3 非对称加密
我们知道,对称加密使用同一把密钥,相反,非对称加密,使用公钥和私钥进行加密解密
可以使用私钥加密,公钥进行解密,同理,也可以使用公钥加密,私钥进行解密
常见非对称加密方式的有:
- RSA
- DSA
我们平时最常用的就是 RSA
特点:
- 使用两把密钥进行加密和解密,即公钥和私钥
- 公钥加密私钥解密,私钥加密公钥可以解密
- 加密或者解密,速度非常慢
- 私钥和公钥是成对出现的
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
二 加密知识总结
** 单向加密:** 不可逆,只要输入的内容一样,输出的密文一定是一样的,有任何修改, 产生的密文都是不同的
** 对称加密:** 加密和解密使用同一把密钥,加密解密速度特别快
非对称加密: 使用公钥和私钥进行加密和解密,公钥加密私钥解,私钥加密公钥解。加密解密的过程非常慢
所谓公钥,就是可以公开给别人的
所谓私钥,就是不可以公开给别人,是自己私有保留的。
注:以上内容,纯粹是加密的知识,和 https
没有任何关系。下面我们开始讲解 https
的过程。我们先看一个需求
解决了这个需求,就明白了 https
的过程了。
从一个需求开始
假设有这样一个需求:小明和小花需要通信,少男少女写情书嘛,肯定不想让别人看到,所以需要安全的通信。
问题一:小明如何安全的把内容传给小花?
通过上面的加密知识的学习,我们很容易就想到,把通信的内容,给加密了就行了啊
答案是对的,把通信的内容给加密就行了。
问题二:使用哪种加密方式加密呢?
单向加密肯定不行,小花收到信,解不出来,这恋爱没法谈
对称加密可以 ,小花只要有密钥,就可以把内容解出来
非对称加密也可以 ,小明用自己的私钥加密,小花拿到小明的公钥,也可以把内容解出来
问题三:对称加密,非对称加密都可以,到底使用哪种呢?
通过上面的加密知识的学习,我们知道
对称加密速度快,非对称加密速度慢
那么对于小明,小花这俩人来说,经常一聊就是几个小时,数据是非常多的
如果使用非对称加密,那估计得郁闷死,因为加密也慢,解密也慢,这俩人肯定不会用非对称加密,要是我,我也不用,急死个人。
那么答案就是,使用对称加密方式 ,因为加密快啊,小明小花,都持有同一把密钥,双方互相都能解密出来对方发的信。
总结:小明和小花通信,使用对称加密,假如密钥是 S
, 双方都使用同一把密钥 S
进行加密,解密
这样小明和小花就能愉快的通信了,而且内容是加密的,加密解密的速度也很快,这很美好。
但是这样有一个隐患,就是密钥 S
, 在传输的过程中,不小心被 老王 截获了
造成的后果就是:小明,小花以及老王,都有相同的密钥 S
了
那么,小明和小花之间没有秘密可言了,他们发的信,老王都能解开看,看完再加密,再发给小花,这还得了。
那么如何解决 密钥S
在传输的过程中,被别人截获的情况呢?
有人说,可以对称加密
方式对密钥S
进行加密, 再传输,那么此时的密钥S1
也是有被截获的风险啊
那就再对 S1 进行加密,再传输...... , 这样就无穷尽了。肯定是行不能的。
上面的方法肯定是不行了,现在的问题,变成了:小明如何把 密钥S
安全的传给小花, 这是不是和之前的问题一小明如何安全的把内容传给小花?
类似
所以,小明和小花如何要安全的通信,就需要使用对称加密
把信件内容加密传输
那么就得先解决一个问题:小明如何安全的把密钥S
传输给小花?
问题四:小明如何安全的把密钥S
传输给小花?
如果密钥S
的传输过程不安全,那么后面的通信就是不安全的,反之,如何密钥S
能安全的传输给小花,那么后面的通信就是安全的。
如果这是领导交待给我们这样一个活,我们使用自己学到的上面的加密知识,应该怎么解决呢?
通过上面的加密知识的学习,是不是有下面这样一个安全的加密传输方式
- 小明使用非对称加密进行通信,首先小明生成了自己的一对私钥和公钥,为了方便,分别叫做
privateKey
,publicKey
- 小明把
publicKey
给了小花
- 方法一 小明用自己的
privateKey
,对密钥S
进行加密,加密后的密文S0
传输给小花,小花用publicKey
对S0
解密出来密钥S
- 方法二 小花用
publicKey
对密钥S
进行加密,加密后的密文S0
传输给小明,小明用privatekey
对S0
解密出来密钥S
上面,方法一 是不可行的,因为小明的 publicKey
是公开的,谁都可以下载,也就是说,老王也有小明的 publicKey
,也可以对 S0
进行解密出来 密钥S
方法二是可行的,因为 privateKey
只有小明有,小花用小明的公钥进行加密,只有小明能解开,其它任何人都解不开
所以上面的解决方案就是:
使用非对称加密
方式,对 密钥S
进行加密,进行传输
有人说,不对啊,非对称加密
性能不好,加密解密特别慢,要不刚一开始,小明,小花直接使用非对称加密
进行通信,不就行了嘛
说的是对的,不过我们这里只是使用非对称加密
对 密钥S
进行加密,这个数据量很小的,而且密钥S
安全的传输给对方之后
后面的通信就直接使用对称加密了,这样效率就高了,而非对称加密只是在开始协商怎么安全传输密钥S
的阶段使用了,此阶段完成后,就不再需要使用了。
通过上面可知:非对称加密有这样的特性
我只要拿到谁的公钥,我和谁通信,就是安全的
比如,你有一对私钥和公钥,我只要拿到你的公钥,然后用你的公钥进行加密传输内容,只有你自己能解开,因为私钥只有你自己有
如下:
反过来,小明用自己的私钥加密,其它人使用小明的公钥解密,这个过程的作用是什么的呢?
答案是:验证身份的。
只要小明用自己的私钥加密,其它人用小明的公钥如果能解开,那么证明这封信一定以及肯定是小明写的
比如你需要发一个通知,但是又要确保这个通知一定是你发的,为了怕别人在中间涂改(比如古代假传圣旨,就是没有做好身份验证)
你可以用你的私钥对通知进行加密,其它人想看的话,通过下载你的公钥,进行解密,能解密出来,说明通知一定是你发的。
因为其它人如果在中间涂改,但是又没有你的私钥重新加密,所以是行不通的。
总结 :通过以上的描述,我们解决了好几个问题,经过了以下几个过程。
- 小明和小花为了安全的通信,采用加密方式,对内容进行加密传输
- 对比来对比去,只能选
对称加密
这种加密方式,对内容进行加密传输 - 但是对称加密的
密钥S
,传输过程不安全,容易被老王窃取,怎么办呢 - 小明想到了
非对称加密
方式,于是就生成了一对私钥公钥,并且把公钥给了小花 - 小花就用公钥对
密钥S
进行加密,传给小明 - 因为是用了小明的公钥加密的,又因为私钥只有小明自己有,所以,只有小明能解密。这个过程哪怕老王截获了密文,也解密不了
- 这样,小明用自己的私钥解密出来了
密钥S
- 此时 小明和小花就用对称加密,
密钥S
, 进行愉快的通信了,比如商量彩礼给多少,酒席在哪办,蜜月在哪度 - 这样,这个通信过程就是安全的了。
上面的过程很完美,但是道高一尺,魔高一丈啊,老王脑子灵光特别好使啊,又想出来一招
既然你俩用非对称加密
,我截取到密文也解密不了,那就换个法子。
如果小花在获取小明的公钥的过程,出了问题,比如小花获取的不是小明的公钥,而且老王的公钥呢(此时小花还以为手里的公钥是小明的呢)
会发生什么?先看一下图(也就是所谓的中间人攻击)
根据上图,老王,也叫做中间人,上图就是中间人攻击,流程如下:
- 小花在获取小明公钥的过程中,被老王给掉包成了自己的公钥,发给了小花
- 小花误以为手里的公钥是小明的 (其实是老王的公钥了),所以就用老王的公钥对
密钥S
进行加密,得到密文S0
密文S0
发给小明的过程中,被老王拦截,老王就用自己的私钥解密,得到了密钥S
- 老王得到
密钥S
后,自己备份一份,再把此密钥S
,用小明的公钥加密,得到密文S1
, 发给小明 - 小明得到
密文S1
后,用自己的私钥解密,得到密钥S
- 以后,小明和小花,就用对称加密方式,
密钥S
进行通信了 - 他俩还以为很安全,其实通信的内容早就被老王先看了一遍了。还是不安全
啊啊啊,要疯了,为了通信安全,我们就加密,但是加密的密钥传输又不安全了
为了密钥传输安全,我们生产了私钥公钥对,把公钥给小花,小花用公钥对密钥加密再传输
这样就只有小明能解密了,没曾想,公钥的传输又不安全了。
谈个恋爱好难啊,老王啊,干的都叫啥事啊。。。
出了问题,总得解决啊,现在是传输公钥的过程,又不安全了
这和上面的问题 怎么把信件内容安全的传输给对方?
以及怎``么把密钥安全的传输给对方?``
是类似的
现在这个问题是:怎么把公钥安全的传输给对方?
感觉进入到了死循环了,不管是把 信件内容
安全传输,还是把密钥
安全传输,还是把 公钥安全
安全传输
本质都是类似的,只不过传输的东西不一样,采用的方法不一样