因为HTTPS涉及到很多加密相关的知识,所以需要先了解这些基础才能更好的理解HTTPS
Hash算法
hash算法是指把任意数据转换成指定?小范围的数据,转换后的数据称为原数据的摘要
或者指纹
,hash算法是不可逆的,所以不能通过hash值得到原数据。
常见的hash算法有SHA1,SHA256,MD5
等
我们在网上下载文件的时候,除了文件本身通常还会看到这样一段信息
文章图片
1563938325731.jpg 这个SHA1指的是利用的是SHA1这种hash算法,后面的值就是对这个文件进行SHA1取值后的摘要,下载文件后我们对文件进行一次hash(网上随都就能找到这种工具),然后和这个值对比,如果一致就说明文件没有被篡改过。
加密和解密
加密起源于古代战争,双方通信的时候为了防止重要信息泄露,发送的一方用秘钥
把信息用某种规则
转化成别人无法看懂的数据,得到的数据称为密文
,这个转化过程称为加密
。接收方得到密文后,用相同的秘钥
用跟加密过程完全逆向
的方式把密文还原得到原本的数据,这个过程称为解密
对称加密
对称的意思是加密和解密过程用的秘钥相同的
,所以要想接收方能解密发送方的密文,只有把秘钥告诉对方,但是网络上传输是没办法保证传输秘钥的安全的,一旦秘钥被截获,加密通信就失效了,所以对称加密是不安全的
文章图片
对称加密.jpg
你可能会想,我要用对称加密的话,加密算法是什么,密钥又从哪里来啊,别担心,现在已经有很多对称加密算法了,密钥生成、加密过程都已经实现了,我们只要调用就行了
经典的对称加密算法有DES
(56 位密钥,密钥太短?而逐渐被弃?用,AES
(128 位、192 位、256 位密钥,现在最流?)
非对称加密
非对称是指加密和解密过程用的秘钥是不同的
。具体方式是通信双方各生成一对秘钥,即公钥
和私钥
,公钥是可以公开的,私钥是保密的。
非对称加密的公钥和私钥的有下面的特点
- 用公钥加密的数据只能用对应私钥来解密,反过来也一样,用私钥加密的密文只能用对应的公钥来解
- 不能或者只能用暴力破解(暴力破解就是不考虑时间、资金成本一个一个的试)通过公钥得到私钥,反之亦然
用对方给的公钥
进行加密,接受的一方用自己保存的私钥
进行解密,这样即使有第三方截获了密文也不能破解,因为没有对应私钥。所以,非对称加密是安全可靠的加密方式文章图片
非对称加密.jpg
举个不恰当的例子来理解一下这个过程
小明要和小红进行加密通信跟对称加密算法一样,目前也有很多成熟非对称加密算法,比如
小明:小红,我要跟你说句话,但是不能让别人看到
小红:好的,这是我的公钥,你拿去,把你要说的话加密就可以了
小明:"我爱你"-->(用小红给的公钥加密)--->“1111”
小红得到小明发送的密文,用自己的私钥解密
小红:"1111"-->(用自己的私钥解密)--->“我爱你”
小红:讨厌
RSA
,DSA
,椭圆曲线算法
等。看了上面的例子,你可能会觉得“嗯,用非对称加密通信果然很安全“,但仔细一想,“不对啊,如果骗子C冒充B给A一个自己的公钥,A得到公钥后以为这个公钥就是B的,就用这个公钥去加密,然后C拿到密文后就可以用自己的私钥解密,不就得到A发送的信息了吗“。
humm,确实是这样的,
非对称加密虽然保证了密文不会被破解,但并不能识别伪装和篡改
。那怎么解决呢?这就需要用到数字签名
了数字签名 数字签名,是非对称加密的一种应用。通常非对称加密是用公钥加密用私钥解密,
数字签名就是反过来用
,即用私钥对数据加密
,这个过程称为签名
,然后用公钥对证书进行解密
,这个过程称为验证
。那么数字签名到底有什么作用呢
- 证明消息是某个特定的用户发送的
根据公钥和私钥能互解的结论,可以证明用公钥能解开的密文一定是持有该公钥对应私钥的用户发的 - 证明消息没有被篡改
通常我们发送一个文件的时候,会先用hash算法
得到文件的摘要,然后对摘要进行签名,并把摘要的签名附加在文件内一起发送。当别人使用这个文件的时候,会先对签名进行解密得到文件的摘要,再把文件做一次hash计算得到文件的摘要,然后对比这2个摘要,如果相同,就证明这个文件是原文件,没有被篡改过
文章图片
签名+加密.jpg emmm?数字签名好像是挺厉害的,但是我们来试想一下这种情况,还是上面ABC的例子,C用自己的公钥对自己的公钥加密生成
公钥签名
,然后公钥和公钥签名都发给A,说“自己就是B,不信你用公钥解密试试”,A试了下,果然一样,然后就用这个公钥加密传信息,结果是A仍然被骗了。这个例子中的难点变成了:签名依然可以伪造,而签名又是用公钥来解的,A没有办法去验证这个签名到底是不是来自B,那么,怎么证明公钥确实来自B?怎么能防止签名被伪造呢?这就需要一个权威机构来做担保人了,举一个现实中的例子
你去面试可以看到,学信网就是那个权威机构,它可以证明你的毕业证书确实是属于你的并且是真实的,不是伪造的。
面试官:那个学校毕业的呀?
你:北大
面试官:北大青鸟?
你:.... 这是我的毕业证书
面试官:毕业证书也有造假的
你:.... 这是学信网,不信自己去查
面试官:哇,大佬什么时候来上班?
回到上面的问题,B为了证明自己的真实性,就需要找"证书中心"(certificate authority,简称CA)做认证,具体过程如下
1.提交自己的
公钥
,注册地址,公司等信息给CA2.CA审核后,用
它自己的私钥
对这些信息签名,生成一个签名文件(也叫证书)
返回3.需要加密通信的时候,带上
自己的公钥签名
和CA颁发的证书
4.因为
CA的公钥是公开
的,只要用它的公钥解开了证书,说明该证书确实是CA颁发认证的,然后证书中的公钥去解公钥签名,再跟证书中的公钥对比,如果一致就证明了发送发的真实性。这个过程可能比较绕,我们依然用上面的例子再来梳理一下
这里我也画了一张图来加深理解
- B为了证明自己的真实性,提交了自己的公钥和其他信息给CA,
- CA机构认证后用CA的私钥对B提交公钥信息进行加密,生成了签名文件交给B
- B为了向A证明自己的真实性,先对自己的公钥签名,然后把CA颁发的证书+公钥签名一起发给A
- A用CA的公钥尝试解密证书,如果能解开,说明证书确实是CA颁发的,然后拿出证书中的公钥尝试解密B的公钥签名,如果能解开并且签名中的公钥和证书中的公钥相同,就证明公钥确实来自B,B确实就是B
文章图片
获取证书.jpg 浏览器验证证书 理解了上面的概念,我们来看一看浏览器的证书验证过程,你也可以自己验证一下,打开一个HTTPS网页,点击左上角的
小锁图标
点击证书
,就能清楚的看到该网站申请的证书信息文章图片
浏览器证书.jpg
【Https基础知识】当访问HTTPS网站的时候,浏览器会取出内置的CA公钥,去验证网站证书,如果验证不通过,就会提示网站证书异常,让用户确认是否继续访问,验证通过就开始后续的通信