HTTPS = HTTP + S(SSL/TLS),其中SSL是一个应用层协议,专门来负责加密的,而TLS是SSL的升级版
关于HTTPS,首先得知道加密,加密是为了保证数据安全。数据在明文传输时,很容易被劫持,那就需要对数据进行加密,通过密文来传输。
明文加密就得到密文,密文解密就得到明文,在加密,解密的过程中,有一个非常重要的东西,那就是:密钥
接下来,就来了解一下密钥
1 密钥
对于密钥来说,加密和解密有两种风格:
1)对称加密
加密和解密使用同一个密钥
2)非对称加密
加密使用一个密钥
解密使用另一个密钥
把其中一个公开出去,就叫公钥,另一个自己保存,叫私钥。这两个密钥谁加密,谁解密都可以,比如:公钥加密,私钥解密或者公钥解密,私钥加密。公钥和私钥其实是一对很大的数字,存在一定的关联关系。
要想进一步了解,得先聊聊HTTPS的工作原理
2 HTTPS工作原理
之前是明文传输的
此时黑客很容易获取到传输的数据内容,也很容易篡改
1)引入对称加密
那就需要对称密钥
此时黑客如果不知道key是啥,就无法对数据进行解密,就无法理解数据的含义,更不必说修改了。
这就涉及到一个问题:服务器是要给N个客户端提供服务的,那多个客户端的密钥是相同还是不同???
答案肯定是不同的。如果都是相同的,意味着黑客自己搞个客户端就拿到密钥了。
既然不一样,那客户端和服务器最开始通信的时候,就需要一方生成唯一的密钥(这里假设客户端生成),通过网络传输给另一方。
密钥本身是明文传输的,极有可能被黑客获取到,一旦黑客拿到密钥,后续的加密操作就毫无意义了。所以就需要对密钥进行加密
如果仍然使用对称加密的方式,就会陷入死循环。所以使用非对称加密
2)引入非对称加密
引入非对称加密,就是为了解决密钥传输的安全性问题。
让服务器生成一对公钥和私钥,公钥是一把锁,私钥是对应的钥匙。私钥,服务器自己保存好,谁也不告诉,公钥谁都可以拿到。
由于黑客手里没有私钥(只有公钥,公钥在这里只能加密),所以黑客不能对888888加密后的数据进行解密。此时数据到达服务器,服务器就会使用私钥进行解密,就可以知道对称密钥是多少了。
看到这,就会有疑问了:直接全用非对称加密不行吗???
实际情况是不行的,得看实际需,应用场景不同
对称加密:运算速度快,开销小,适合针对大量数据加密
非对称加密:运算速度慢,开销大,加密小的数据还可以,加密大量数据就不行了,会非常耗时
所以 业务数据(大量)通过对称密钥来加密,对称密钥(小)通过非对称加密的方式来加密。
那什么是业务数据呢?
业务数据可以理解为 围绕咱们程序展开的一些过程。写程序是要解决实际问题的,解决实际问题的过程就成为“业务”。
针对上面的流程,黑客能否入侵服务器,把私钥拿到呢?
理论上是可行的,但是实际上,难度要比入侵网络设备更难,成本更高。
3)中间人攻击
其实,上述这样的流程存在重大安全隐患,黑客可以通过特殊手段来获取到对称密钥,来破坏后续传输的安全性。这个特殊手段就是中间人攻击
比如:
不难看出,如果能让客户端区分出哪个是正确的,哪个是错误的,就好办了
所以引入校验机制
4)引入校验机制
中间人攻击的关键,在于客户端无法区分收到的公钥是否是服务器真实的公钥 还是被黑客篡改的公钥
那就需要想办法能够对公钥是否正确,进行校验
那就需要:证书(证明公钥合法的一种机制)
服务器搭建的时候,申请一次证书就可以了。申请到的证书,服务器就保存好
其中,最关键的一点就是数字签名,本质上是一个被加密的校验和(把要校验的数据部分代入一个固定的公式,算出的一个数字)
在上面的图中,会把这些关键信息(包含公钥)作为输入生成校验和。有了校验和还不够,还会对校验和进行加密,第三方机构也生成一对非对称密钥(比如 pri2 pub2),使用 pri2 (公证机构自身持有)进行加密。以上就是数字签名的来源。
那数字签名有什么作用呢?
可以用来验证身份。输入的值是相同的,得到的校验和就是相同的,输入的值不相同,得到的校验和大概率不相同,如果发现校验和不相同,输入的值就是不同的。
第一步不是问公钥是啥了,而是问证书
客户端收到证书,就要进行校验:
1)客户端需要针对证书中的其他字段,使用同样的算法,再算一次校验和,就会得到校验和1
2)再通过公证机构的公钥 pub2,对数字签名进行解密,得到校验和2
3)对比校验和1 和 校验和2 是否相同。如果相同,说明证书是没有被修改过的,如果不同,则证书无效,中间被人篡改了
看到这,就会有一个疑问:客户端如何确保拿到的pub2是公正机构的pub2而不是黑客伪造的pub2呢?
那是因为pub2根本就不是通过网络传输的,而是操作系统中内置的。安装好系统,系统就内置了一系列知名公正机构的的公钥。只要安装正版系统,不是黑客搞的盗版系统,就可以信任pub2是正确合法的。
如果黑客想要直接修改证书中的公钥为自己的公钥,此时就会导致客户端的校验和 和 解密出来的校验和就对不上了,此时客户端就会报错。浏览器就会弹出一个红色的页面,告诉你该网站不安全,是否要继续访问。
如果修改公钥不成功,那黑客能否自己申请一个证书,用自己的证书,整个替换服务器的证书?
这个也是不行的,因为证书中包含服务器的域名。黑客申请的证书的域名和正经服务器的证书域名肯定是不同的。浏览器这边还是可以验证,输入的url的域名和得到的证书的域名是不是匹配,不匹配的话,同样认为证书非法。浏览器就会弹出一个红色的页面,告诉你该网站不安全,是否要继续访问。
OK啦,到此结束!!!!