HTTPS是在HTTP的基础上,引入加密层(SSL),HTTP是明文传输(不安全的)。之前就出现了,运营商劫持等等问题,因此就引入了HTTPS,解决安全问题,最核心的要点,就是"加密",主要分为了俩点:1. 对称加密 2. 非对称加密
1. 引入对称加密
简单来说对称加密就是加密和解密,使用的是同一个密钥。这里引入的加密是对传输数据进行保护,主要就是针对header和body 进行加密。主要通过对称加密的方式,针对传输数据进行加密操作。
对称加密的时候,客户端和服务器需要使用同一个密钥。
不同的客户端,需要使用不同的密钥。(如果这里所有的客户端密钥都相同,加密形式虚设,黑客就很容易拿到密钥)。
总结: 这就意味着,每个客户端连接到服务器的时候,都需要自己生成一个随机的密钥,并且这个密钥告知服务器。(也不一定非得客户端生成,服务器生成也行,也是需要告诉客户端的)。
这就是问题的关键!!密钥需要传输给对方的,一旦黑客拿到了这个密钥,意味着加密操作就无意义了。需要考虑,针对咋们的密钥,也进行密文传输。假设使用对称加密,引入key2 针对key进行key进行加密,意味着就需要把key2也传输给服务器,服务器才能解密到可以,但是在传输过程中还是肯被黑客拿到的。
2. 引入非对称加密
简单来说,非对称加密,使用的是俩个密钥。这俩个密钥,k1,k2是成对的。俩个密钥,就可以一个公开出去,称为"公钥",另一个自己保存好,称为"私钥"。
引入它主要就是针对 对称密钥的传输,进行加密。 (由于非对称加密系统开销,远远大于对称加密。针对大规模的数据加密,不太合适使用非对称加密。)
服务器生成一对非对称密钥,私钥服务器自己持有,公钥可以告任何的客户端。
1.客户端在连上服务器之后,就需要先从服务器这边拿到公钥,(公钥本身就可以公开出去,不需要加密传输)客户端生成对称密钥,拿着公钥针对对称密钥加密。2.此时就可以把加密之后的密文进行传输了,由于想要解密,必须通过私钥,而且私钥只有服务器自己知道,此时这样的加密数据就可以比较安全的到达服务器。3.服务器通过私钥解密之后得到了对称密钥,接下来和客户端之间的通信就通过对称加密来完成了。
SSL内部完成的工作是上图的连线,使用HTTPS的时候,层底也是TCP,先进行 TCP三次我输,TCP连通之后,就要进行SSL的握手了(交换密钥的过程)后面才是真正传输业务数据。
而且这个办法不是百分之一百安全的,就例如: 服务器可以创建出一对公钥和私钥,黑客也可以按照同样的方式,创建出一对公钥和私钥,冒充自己是服务器。如图:
那针对上述问题,如何解决???
最关键的一点,客户端拿到公钥的时候,要有办法验证,这个公钥是否 是真的,而不是黑客伪造的。要求服务器这边提供一个"证明",证书是一个结构化的数据(里面包含很多属性,最终以字符串的形式提供)证书中汇报一系列的信息,比如:服务器的主域名,公钥,证书有效期....证书是搭建服务器的人,要从第三方的公正机构进行申请的。(申请的时候当然要提交材料,人家要审核)。
客户端拿到证书之后,主要的俩件事:
-
按照同样的校验和算法,把证书的其他字段都重新算一遍,得到校验和1
-
使用系统中内置的公正机构公钥,对证书中的签名进行解密,得到校验和2
此时,就可以比对,看着俩校验和是否一致!如果一致,说明证书是没有被修改过的,就是原版证书。如果不一致说明证书被别人篡改过了。(比如黑客如果替换了自己的公钥,此时算出来的校验和一定发生改变),此时客户端就能识别出来了(此时浏览器这边会弹出一个告警页面,告诉用户你访问的网站有风险)。
黑客无法修改证书的内容,因为:
1.如果黑客直接修改公钥,不修改签名,此时客户端验证的校验和是一定不一样的,就识别出来了。
- 如果黑客修改公钥,也尝试重新生成签名,由于黑客不知道公证机构的私钥,所以黑客无法重新生成佳明的签名,如果黑客拿自己的私钥加密呢??客户端这边拿着公证机构的公钥加密也会失败。