HTTP协议内容是按照文本的方式明文传输的
这就是导致传输过程中会有篡改情况。
解决安全问题的核心:“加密”
黑客领域的攻防,都是“相对”概念,对抗的过程。但是可以做到,即使黑客拿到了数据,他也无法解析/篡改,也能起到安全的效果。
引入加密是保证数据安全的有效手段
只要破解成本,超出了要保护的数据价值本身,就是安全的。
密码学中的几个重要的概念:
明文:要传输的真实数据,要表达的实际意思。
密文:针对明文加密之后,得到的结果。
加密和解密涉及一个关键道具:密钥
对称密钥:加密和解密使用同一个密钥
非对称密钥:加密和解密使用两个密钥,这两个密钥k1,k2是成对的,可以使用k1加密,k2解密,反之亦然。 => 这个特性的背后有一系列的数学原理。两个密钥,公开一个出去,称为“公钥”,另一个保存好为“私钥”。手里只有一把的话,无法知道另一把是啥(也有一系列的数学原理)
HTTPS工作流程:
只要针对HTTPS的数据进行解密了,就能够得到HTTP格式的数据。
运营商劫持,无论是修改referer还是修改返回的链接(body),本质上都是因为明文传输。
需要引入加密,对上述传输的数据进行保护,主要是针对header和body进行加密
第一步:引入对称加密
通过对称加密的方式,针对传输的数据进行加密操作。
1.对称加密的时候,客户端和服务器需要使用同一个密钥。
2.不同的客户端,需要使用的密钥不同。(如果所有的客户端密钥都相同,加密形同虚设,黑客很容易拿到密钥)
这就意味着,每个客户端连接到服务器的时候,都需要自己生成一个随机的密钥,并且把这个密钥告知给服务器。(也不一定非得是客户端生成,服务器也可以,也需要告知客户端)
问题:密钥需要传给对方,一旦黑客拿到了密钥就意味着加密操作无效
即使通过密文传输,黑客也是可以进行解密了
需要考虑,针对密钥进行密文加密。假设使用对称加密,引入key2针对key进行加密,就意味着需要把key2也传输给服务器,服务器解密才能拿到key。
第二步:引入非对称加密
目的:
使用非对称加密,主要的目的就是为了对对称密钥进行加密,确保密钥的安全性
不能使用非对称加密,针对后续传输的各种header、body等进行加密,而是只能使用非对称加密区加密对称密钥。
非对称加密的加密解密成本很高(消耗的cpu等资源)要远远高于对称加密
黑客手里虽然有公钥,但是密文需要私钥才能解密,私钥黑客拿不到。黑客就无法对这个数据解密,也就不能拿到666对称密钥了。
此处就让服务器持有私钥(只有服务器知道),客户端持有公钥(黑客也可以知道)
客户端就可以使用公钥,对生成的对称密钥进行加密,只要666安全到达服务器,后续服务器和客户端就可以使用666作为对称加密的密钥,此时黑客就无法破解后续的数据了。
此时的公钥、私钥可以理解为:主人手上有信箱钥匙(私钥),邮递员手上有锁头(公钥)
步骤:
服务器生成一对非对称密钥,私钥服务器自己持有,公钥可以告诉给任何的客户端。
客户端在连上服务器之后,就需要先从服务器这边拿到公钥(公钥本身就可以公开出去,不需要加密处理)
客户端生成对称密钥,拿着公钥针对对称密钥进行加密。此时就可以把加密之后的密文进行传输了。由于要想解密,必须通过私钥,而私钥只有服务器自己知道,此时这样的加密的数据就可以比较安全的到达服务器。
服务器通过私钥解密之后,得到了对称密钥,接下来和客户端之间的通信就通过对称加密来完成了。
此处的各种密钥本质上都是一串数字/字符串
前两次传输为SSL内部完成的工作,使用HTTPS时,底层也是TCP,先进行三次握手,TCP连接打通之后,就要进行SSL握手了(交换密钥的过程),后面才是真正传输业务数据(完整的HTTPS的请求/响应了)
此时黑客拿到的是一个key加密后的结果,要想解密需要知道pri。pri私钥只有服务器自己知道,黑客不知道。(黑客监听中间的通信数据,要比黑入服务器容易,如果可以黑入服务器,大概率可以直接拉取数据库的内容了)
问题:
服务器可以创建私钥、公钥,黑客也可以按照同样的方式创建出公钥和私钥,冒充服务器
黑客自己也能生成一对公钥和私钥,pub2和pri2.黑客不关心服务器的公钥私钥是啥,自己生成一对。生成公钥、私钥算法是公开的,服务器可以生成,黑客也可以。
黑客就可以使用pub2对上述数据加密,因此黑客就拿到了key。黑客继续使用从服务器拿到的pub重新对key进行加密并传给服务器。
服务器拿到数据后,使用pri进行解密,可以解密成功,于是服务器知道对称密钥为key
后续的通信,服务器和客户端之间,仍然会使用key作为加密的密钥,此时后续传输的各种数据就都可以被黑客解密了。
解决方法:
针对上述问题,最关键的一点是:客户端拿到公钥后,要验证该公钥是否是真的,而不是黑客伪造的。
要求服务器提供一个“证书”。 => 一个结构化的数据(里面有包含很多属性,最终以字符串的形式提供)证书会包含一系列的信息(比如:服务器的主域名,公钥,证书的有效期)
证书是搭建服务器的人要从第三方的公正机构进行申请的(申请要提交材料,审核)
第三步:证书验证
返回证书时,证书数据也经过了黑客设备,但是黑客不能修改证书的公钥为自己的公钥,客户端拿到证书后,会针对证书验证真伪。
颁布证书的公证机构会在发布证书时,给证书计算一个校验和,然后公证机构使用自己的私钥(和服务器的私钥无关),针对校验和进行加密,此时就得到了证书的签名。
此处所谓的“签名”本质上是一个经过加密的校验和!把证书中其他的字段通过一系列的算法(CRC,MD5)得到一个较短的字符串 => 校验和。
如果两份数据内容一样,此时校验和就一定是相同的;如果校验和不同,两份数据的内容则一定不同。
客户端拿到问题后,主要做两件事:
1.按照同样的算法,把证书的其他字段都重新算一遍,得到校验和1。
2.使用系统中内置的公证机构公钥,对证书中的签名进行解密,得到校验和2。此时就可以进行对比,看着两个校验和是否一致。 如果一致,说明证书没有被修改过的,就是原版证书了。 如果不一致,说明证书被修改过了(比如黑客替换了自己的公钥,此时计算出的校验和一定会发生变化),此时客户端就能识别出来了。此时浏览器就会弹出一个警告页面,告诉用户,访问的网站有危险。
防止黑客篡改,而不是防止黑客知道,黑客的系统也内置了公证机构的公钥,黑客也能解密。但是黑客无法修改证书内容。
1)如果黑客直接修改公钥,不修改签名。此时,客户端验证的校验和时不一样的,就识别出来了。
2)如果黑客修改公钥,也尝试重新生成签名。由于黑客不知道公证机构的私钥,所以黑客无法重新生成加密的签名。如果黑客拿自己的私钥加密,客户端拿着公证机构的公钥也会解密失败。
3)黑客自己也申请一个证书,把自己的证书替换掉服务器的证书。但是域名是唯一的,黑客申请的证书的域名和服务器的域名肯定不一样,客户端拿到证书后,发现域名不同,直接就知道证书时假的了。
上述操作,把黑客篡改证书的行为堵死了
上述讨论的过程,所谓的安全也不是绝对的安全,上述的安全本质是基于非对称加密体系。但是非对称加密体系也不是无懈可击的,只不过破解这样的加密体系,需要的计算量是很大的,超出了现有计算机的算力上限。