众所周知https和http相比更加安全一些,是由于https通过了加密。可是https具体是怎样进行加密来对抗通讯过程当中的各类劫持和篡改呢。它又是怎样站在用户的角度保障用户访问的页面是安全的,站在网站的角度一样会保障网站不会被恶意攻击。想经过这篇文章大概进行一些梳理。将围绕如下两点进行分析:算法
加密有两种算法:对称加密和非对称加密安全
A要给B发一封邮件,不想让其余人知道邮件内容,因而用B的公钥对内容进行加密后发送,B在收到邮件后用本身的B私钥进行解密。这样一来即便中途这封邮件被中间人拦截,这个中间人没有B的私钥也只能获得一堆乱码,毫无心义。网络
可是这样通讯的问题是B天天会收到各类各样的邮件,它没法区分邮件的来源。若是有黑客冒充A的身份,也用B的公钥加密了一封邮件发送(前面说过公钥是全部人均可以认领的),此时B解密后的获得的邮件其实并非A真实的诉求内容。为了可以区分邮件的来源,A和B换了一种通讯方式:性能
A为了保证B收到的邮件都是本身本人发送的,因而用A私钥加密内容而后发送,B接收的时候用A公钥解密。这样因为A私钥的惟一性能够保证只有A能处理这封邮件。可这样显然是不妥的,由于A公钥的公开性,任何劫持到邮件的中间人均可以知道邮件内容了。网站
显然,这种单方面用公钥或是私钥加密行为不管怎样都会出现漏洞,因此他们引入了数字签名来进行进阶版的加密传输,也就是Level 2。加密
既然用公钥活私钥来传输都有漏洞,那就把公钥和私钥结合起来使用。A先把邮件用A私钥加密一次,再用B公钥加密一次,两层加密后发送。B在收到邮件后先用B私钥进行解密,再用A公钥进行解密。这样一来,中间人既没有B的私钥去破解邮件内容,也没有A的私钥去冒充A的身份。这个传输过程显然比Level 1更加严谨。可是这样有一个弊端:hash
对文件自己加密多是个耗时过程,好比这封邮件足够大,那么用A私钥加密整个文件以及拿到文件后的解密无疑是巨大的开销。其实A私钥的此次加密只是为了证实信息来源是否可信,因此大可没必要对所有内容进行加密。因而A先对整个文章执行哈希运算获得一个hash值。针对这个hash值用A私钥加密,附加到邮件的后面。这就是咱们常说的数字签名了。而后再把全部内容用B公钥进行加密后发送。it
B收到邮件后的步骤:首先用B私钥进行解密,获得邮件内容和A的数字签名。再用A公钥解密数字签名获得hash值1。最后B对邮件内容执行一次哈希运算也获得一个hash值2。用这个hash值2对比数字签名的hash值1,若是同样就说明文件内容没有被篡改过,近乎完美又不失性能。class
但是即使这样,依然是有漏洞的。若是中间人C就是想作点坏事,他能够去B的电脑上把A公钥悄悄换成本身的C公钥(毕竟公钥是有公开性的,人人能够拿到)。接下来生成本身的数字签名。B那边接收的时候层层校验都会经过。最后C仍然能够冒充A的身份去欺骗B。乱码
这种防不胜防的感受是否是有点崩溃,坚持一下,就要差最后一步就要成功了。如今咱们整个加密,传输环环相扣。惟一的问题就出在了A公钥太容易被替换了。那怎样来保障A公钥呢,就是咱们接下来要说的数字证书了。
A要保护本身的A公钥进而保护传输的安全性,首先A去找"证书中心"(certificate authority,简称CA)为A公钥作认证。证书中心用本身的私钥,对A公钥和一些相关信息一块儿加密,生成"数字证书"。而后A发给B的邮件后面除了数字签名还会加上这个数字证书。
B接受到之后首先用CA获得公钥解密校验数字证书,获得A的公钥,拿到A的公钥后的解密步骤就和Level 2同样了。
这样下来A公钥多了一层加密程序。想要在A公钥上动手脚除非拿到CA的私钥。CA的私钥就成了如今的安全漏洞了。若是中间人如今又拿到了CA的私钥怎么办呢。
他拿不到!CA是一个颇有权威的社会机构了,能够默认它的私钥是不会泄露的,若是有一天CA私钥泄露了应该会后果不堪设想。至此,就真的完美了。
大概捋顺了加密的过程,可是在用户访问咱们的网站的时候面对大量的请求,具体是怎样校验这些请求是否包含恶意请求的。用户又怎么避免访问到恶意网站呢
暂时没捋清楚,后面及时来更新哈哈哈。