你必须要懂的HTTPS知识

317 阅读8分钟

因为HTTPS涉及到很多加密相关的知识,所以需要先了解这些基础才能更好的理解HTTPS

Hash

hash算法是指把任意数据转换成指定⼤大⼩小范围(通常很⼩小,例例如 256 字节以内)的数据,转换后的数据称为原数据的摘要或者指纹,不能通过hash值得到元数据。

常见的hash算法有SHA1,SHA256,MD5

在网上下载文件的时候,除了文件本身通常还会看到这样一段信息

这个SHA1指的是利用的是SHA1这种hash算法,后面的值就是对这个文件进行SHA1取值后的摘要,下载文件后我们对文件进行一次hash(网上随都就能找到这种工具),然后和这个值对比,如果一直则说明文件没有被篡改过。

加密和解密

加密起源于古代战争,双方通信的双时候为了防止重要信息泄露,发送的一方用秘钥把信息用某种规则转化成别人无法看懂的数据,得到的数据称为密文,这个转化过程称为加密。接收方得到密文后,用相同的秘钥用跟加密过程完全逆向的方式把密文还原得到原本的数据,这个过程称为解密

对称加密

对称的意思是加密和解密过程用的秘钥相同的,要想接收方能解密发送方的密文,只有把秘钥告诉对方,但是网络上传输是没办法保证传输秘钥的安全的,一旦秘钥被截获,加密通信就失效了,所以对称加密是不安全的

你可能会想,我要用对称加密的话,加密算法是什么,密钥又从哪里来啊,别担心,现在已经有很多对称加密算法了,密钥生成、加密过程都已经实现了,我们只要调用就行了

经典的对称加密算法有DES(56 位密钥,密钥太短⽽而逐渐被弃⽤用,AES(128 位、192 位、256 位密钥,现在最流⾏)

非对称加密

非对称是指加密和解密过程用的秘钥是不同的。具体方式是通信双方各生成一对秘钥,即公钥和私钥,公钥是可以公开的,私钥是保密的。

非对称加密的公钥和私钥的有下面的特点

  • 用公钥加密的数据只能用私钥来解密,反过来也一样,用私钥加密的密文只能用对用的公钥来解
  • 不能或者只能用暴力破解(暴力破解就是不考虑时间、资金成本一个一个的试)通过公钥得到私钥,反之亦然

通信时,发送的一方用对方给的公钥进行加密,接受的一方用自己保存的私钥进行解密,这样即使有第三方截获了密文也不能破解,因为没有私钥

举个不恰当的例子来理解一下这个过程

小明要和小红进行加密通信 小明说:小红,我要跟你说句话,但是不能让别人看到 小红:好的,这是我的公钥,你拿去,把你要说的话加密就可以了 小明:"我爱你"-->(用小红给的公钥加密)--->“@#@#” 小红得到小明发送的密文,用自己的私钥解密,"@#@#"-->(用自己的私钥解密)--->“我爱你” 小红:讨厌

跟对称加密算法一样,目前也有很多成熟非对称加密算法,生成公钥私钥、加密解密都帮我们做好了,常见的非对称加密算法有RSADSA椭圆曲线算法

看了上面的例子,你可能会觉得“嗯,用非对称加密通信果然很安全“,但是聪明的你再仔细一想,“不对啊,如果骗子C冒充B给A一个自己的公钥,A得到公钥后以为这个公钥就是B的,就用这个公钥去加密,然后C拿到密文后就可以用自己的私钥解密不就得到A发送的信息了吗“。

humm,确实是这样的,非对称加密虽然保证了密文不会被破解,但并不能识别伪装和篡改。这就是著名的中间人攻击,那怎么解决呢?这就需要用到数字签名

数字签名

数字签名,是非对称加密的一种应用。通常非对称加密是用公钥加密用私钥解密,数字签名就是反过来用,即用私钥对数据加密,这个过程称为签名,然后用公钥对证书进行解密,这个过程称为验证

那么数字签名到底有什么作用呢

  • 证明消息是某个特定的用户发送的 根据公钥和私钥在数学上的对应关系,可以证明用公钥能解开的密文一定是持有该公钥对应私钥的用户发的,当通信双方对消息及其内容产生争论的时候,数字签名就是一个很有利的证据
  • 证明消息没有被篡改 通常我们发送一个文件的时候,会先用hash算法得到文件的摘要,在对摘要进行签名,并把摘要的签名附加在文件内一起发送。当别人使用这个文件的时候,会先对签名进行解密得到文件的摘要,再把文件做一次hash计算得到文件的摘要,然后对比这2个摘要,如果相同,就证明这个文件是原文件,没有被篡改过

这个过程可能有点抽象,我画了一个图来让你更容易看懂,如果不明白什么是hash计算的同学,可以先跳到对应部分看一看

证书

emmm?数字签名好像是挺厉害的,那我们来试想一下这种情况,还是上面的ABC例子,C用自己的私钥对自己的公钥加密生成公钥签名,并把公钥和公钥签名都发给A,说自己就是B,不信你用公钥解公钥签名得到的公钥跟我发给你的是一致,A一式,果然一样,然后就用这个公钥加密传信息,结果是A仍然被骗了。这个例子中的难点现在变成了:签名依然可以伪造,而签名又是用公钥来解的,A没有办法去验证这个签名到底是不是来自B

那么,怎么证明公钥确实来自B,怎么能防止签名被伪造呢?这就需要一个权威机构来做担保人了,举一个现实中的例子

你去面试 面试官:那个学校毕业的呀? 你:北大 面试官:北大青鸟? 你:.... 这是我的毕业证书 面试官:毕业证书也有造假的 你:.... 这是学信网,不信自己去查 面试官:哇,大佬什么时候来上班?

可以看到,学信网就是那个权威机构,它可以证明你的毕业证书确实是属于你的并且是真实的,不是伪造的。

回到上面的问题,B为了证明自己的真实性,就需要找"证书中心"(certificate authority,简称CA)做认证,具体过程如下

1.提交自己的公钥,注册地址,公司能信息给CA 2.CA审核后,用它自己的私钥对这些信息签名,生成一个签名文件(也叫证书)返回 3.需要加密通信的时候,带上自己的公钥签名CA颁发的证书(即自己的公钥签名+CA证书) 4.因为CA的公钥是公开的,只要用它的公钥解开了证书,说明该证书确实是CA颁发认证的,然后用发送方的公钥(来自于证书)去解开公钥签名,再跟证书中的公钥对比,如果一致就证明了发送发的真实性。

这个过程可能比较绕,我们依然用上面的例子再来梳理一下

  • B为了证明自己的真实性,提交了自己的公钥和其他信息给CA,
  • CA机构认证后用CA的私钥对B提交公钥信息进行加密,生成了签名文件交给B
  • B为了向A证明自己的真实性,先对自己的公钥签名,然后把CA颁发的证书+公钥签名一起发给A
  • A用CA的公钥尝试解密证书,如果能解开,说明证书确实是CA颁发的,然后拿出证书中的B公钥尝试解密公钥签名,如果能解开并且签名中的公钥和证书中的公钥相同,就证明B公钥的真实性

浏览器验证证书

理解了上面的概念,我们来看一看浏览器的证书验证过程,你也可以自己验证一下,打开一个HTTPS网页,点击左上角的小锁图标点击证书,就能清楚的看到该网站申请的证书信息

当访问HTTPS网站的时候,浏览器会取出内置的CA公钥,去验证网站证书,如果验证不通过,就会提示网站证书异常,让用户确认是否继续访问,验证通过就开始后续的通信