阅读 822

数字签名,数字证书,HTTPS

前言

众所周知https和http相比更加安全一些,是因为https经过了加密。但是https具体是怎样进行加密来对抗通信过程中的各种劫持和篡改呢。它又是怎样站在用户的角度保障用户访问的页面是安全的,站在网站的角度同样会保障网站不会被恶意攻击。想通过这篇文章大概进行一些梳理。将围绕以下两点进行分析:

  • 加密的方式
  • 加密在具体应用场景中体现出来的安全性

加密的方式

加密有两种算法:对称加密和非对称加密

  • 对称加密:加密和解密的密钥一样,比如用123456来加密就用123456进行解密。密码也都是以数据的形式在网络中进行传输的,这样的话一旦123456被泄露,中间人截取了这个请求,加密就会直接被攻破。
  • 非对称加密:把密钥分为公钥和私钥,公钥是公开的所有人都可以认领,私钥是保密的只有一个人知道。大部分情况下,公钥的作用是对内容本身加密,保证不被其他人看到。私钥的作用是证明内容的来源是否可信,公钥和私钥是配对关系,公钥加密就用私钥解密,反之亦然。接下来我们逐层的去分析这个加密的过程。

Level 1

A要给B发一封邮件,不想让其他人知道邮件内容,于是用B的公钥对内容进行加密后发送,B在收到邮件后用自己的B私钥进行解密。这样一来即使中途这封邮件被中间人拦截,这个中间人没有B的私钥也只能得到一堆乱码,毫无意义。

但是这样通信的问题是B每天会收到各种各样的邮件,它无法区分邮件的来源。如果有黑客冒充A的身份,也用B的公钥加密了一封邮件发送(前面说过公钥是所有人都可以认领的),此时B解密后的得到的邮件其实并不是A真实的诉求内容。为了能够区分邮件的来源,A和B换了一种通信方式:

A为了保证B收到的邮件都是自己本人发送的,于是用A私钥加密内容然后发送,B接收的时候用A公钥解密。这样由于A私钥的唯一性可以保证只有A能处理这封邮件。可这样显然是不妥的,因为A公钥的公开性,任何劫持到邮件的中间人都可以知道邮件内容了。

显然,这种单方面用公钥或是私钥加密行为无论怎样都会出现漏洞,所以他们引入了数字签名来进行进阶版的加密传输,也就是Level 2。

Level 2 (数字签名)

既然用公钥活私钥来传输都有漏洞,那就把公钥和私钥结合起来使用。A先把邮件用A私钥加密一次,再用B公钥加密一次,两层加密后发送。B在收到邮件后先用B私钥进行解密,再用A公钥进行解密。这样一来,中间人既没有B的私钥去破解邮件内容,也没有A的私钥去冒充A的身份。这个传输过程显然比Level 1更加严谨。但是这样有一个弊端:

对文件本身加密可能是个耗时过程,比如这封邮件足够大,那么用A私钥加密整个文件以及拿到文件后的解密无疑是巨大的开销。其实A私钥的这次加密只是为了证明信息来源是否可信,所以大可不必对全部内容进行加密。于是A先对整个文章执行哈希运算得到一个hash值。针对这个hash值用A私钥加密,附加到邮件的后面。这就是我们常说的数字签名了。然后再把所有内容用B公钥进行加密后发送。

B收到邮件后的步骤:首先用B私钥进行解密,得到邮件内容和A的数字签名。再用A公钥解密数字签名得到hash值1。最后B对邮件内容执行一次哈希运算也得到一个hash值2。用这个hash值2对比数字签名的hash值1,如果一样就说明文件内容没有被篡改过,近乎完美又不失性能。

可是即便这样,依然是有漏洞的。如果中间人C就是想做点坏事,他可以去B的电脑上把A公钥悄悄换成自己的C公钥(毕竟公钥是有公开性的,人人可以拿到)。接下来生成自己的数字签名。B那边接收的时候层层校验都会通过。最后C仍然可以冒充A的身份去欺骗B。

这种防不胜防的感觉是不是有点崩溃,坚持一下,就要差最后一步就要成功了。现在我们整个加密,传输环环相扣。唯一的问题就出在了A公钥太容易被替换了。那怎样来保障A公钥呢,就是我们接下来要说的数字证书了。

Level 3 (数字证书)

A要保护自己的A公钥进而保护传输的安全性,首先A去找"证书中心"(certificate authority,简称CA)为A公钥做认证。证书中心用自己的私钥,对A公钥和一些相关信息一起加密,生成"数字证书"。然后A发给B的邮件后面除了数字签名还会加上这个数字证书。

B接受到以后首先用CA得到公钥解密校验数字证书,得到A的公钥,拿到A的公钥后的解密步骤就和Level 2一样了。

这样下来A公钥多了一层加密程序。想要在A公钥上动手脚除非拿到CA的私钥。CA的私钥就成了现在的安全漏洞了。如果中间人现在又拿到了CA的私钥怎么办呢。

他拿不到!CA是一个很有权威的社会机构了,可以默认它的私钥是不会泄露的,如果有一天CA私钥泄露了应该会后果不堪设想。至此,就真的完美了。

加密在具体应用场景中体现出来的安全性

大概捋顺了加密的过程,但是在用户访问我们的网站的时候面对大量的请求,具体是怎样校验这些请求是否包含恶意请求的。用户又怎么避免访问到恶意网站呢

暂时没捋清楚,后面及时来更新哈哈哈。

文章分类
阅读
文章标签