目录
HTTPS 是什么
HTTPS 的工作过程
对称加密
非对称加密
引入证书
理解数据签名
通过证书解决黑客攻击
HTTPS 是什么
HTTPS也是一个应用层协议, 是在HTTP协议的基础上引入了一个加密层.
HTTP协议内容都是按照文本的方式明文传输的, 这就导致在传输过程中出现一些被篡改的情况.
HTTPS 的工作过程
既然要保证数据安全,就需要进行"加密".
网络传输中不再直接传输明文了, 而是加密之后的"密文".
加密的方式有很多,但是整体可以分成两大类: 对称加密和非对称加密
对称加密
对称加密其实就是通过同一个"密钥" , 把明文加密成密文, 并且也能把密文解密成明文.
假设明文a= 1234, 密钥key = 8888
则加密 a^key 得到的密文b为 9834.
然后针对密文 9834 再次进行运算b ^ key, 得到的就是原来的明文1234.
(对于字符串的对称加密也是同理, 每一个字符都可以表示成一个数字)
当然,按位异或只是最简单的对称加密. HTTPS中并不是使用按位异或.
引入对称加密之后,即使数据被截获, 由于黑客不知道密钥是啥, 因此就无法进行解密, 也就不知道请求的真实内容是啥了.
但事情没这么简单, 服务器同一时刻其实是给很多客户端提供服务的. 这么多客户端, 每个人用的秘钥都必须是不同的(如果是相同那密钥就太容易扩散了,黑客就也能拿到了). 因此服务器就需要维护每个客户端和每个密钥之间的关联关系,这也是个很麻烦的事情~
比较理想的做法,就是能在客户端和服务器建立连接的时候,双方协商确定这次的密钥是啥
但是如果直接把密钥明文传输, 那么黑客也就能获得密钥了, 此时后续的加密操作就形同虚设了.
因此密钥的传输也必须加密传输!
但是要想对密钥进行对称加密,就仍然需要先协商确定一个"密钥的密钥". 这就成了 "先有鸡还是先有蛋" 的问题了.
此时密钥的传输再用对称加密就行不通了, 就需要引入非对称加密.
非对称加密
非对称加密要用到两个密钥, 一个叫做 "公钥", 一个叫做 "私钥".
公钥和私钥是配对的. 最大的缺点就是运算速度非常慢,比对称加密要慢很多.
- 通过公钥对明文加密, 变成密文
- 通过私钥对密文解密, 变成明文
也可以反着用
- 通过私钥对明文加密, 变成密文
- 通过公钥对密文解密, 变成明文
- 客户端在本地生成对称密钥,通过公钥加密,发送给服务器.
- 由于中间的网络设备没有私钥,即使截获了数据, 也无法还原出内部的原文,也就无法获取到对称密
- 服务器通过私钥解密, 还原出客户端发送的对称密钥. 并且使用这个对称密钥加密给客户端返回的响应数据.
- 后续客户端和服务器的通信都只用对称加密即可. 由于该密钥只有客户端和服务器两个主机知道, 其他主机/设备不知道密钥即使截获数据也没有意义.
由于对称加密的效率比非对称加密高很多,因此只是在开始阶段协商密钥的时候使用非对称加密, 后续的传输仍然使用对称加密.
上述操作下, 仍然存在重大的安全漏洞, 黑客仍然是有办法获取到对称密钥key
服务器可以创建出一对公钥和私钥, 黑客也可以按照同样的方式, 创建出一对公钥和私钥, 冒充自己是服务器.
要想解决上述问题, 最关键的一点, 客户端拿到公钥的时候, 要能有办法验证这个公钥是否是真的, 而不是黑客伪造的.
引入证书
服务端在使用HTTPS前,需要向CA机构申领一份数字证书,数字证书里含有证书申请者信息、公钥信息等。服务器把证书传输给浏览器,浏览器从证书里获取公钥就行了,证书就如身份证,证明服务端公钥的权威性
这个证书可以理解成是一个结构化的字符串,里面包含了以下信息:
- 证书发布机构的信息
- 证书有效期
- 服务器的公钥
- 服务器的域名
- 证书所有者
- 证书的签名
- .......
需要注意的是:申请证书的时候,需要在特定平台生成查,会同时生成一对密钥,即公钥和私
钥。这对密钥对就是用来在网络通信中进行明文加密以及数字签名的。
理解数据签名
当服务端申请CA证书的时候,CA机构会对该服务端进行审核,并专门]为该网站形成数字签名,过程如下:
- CA机构拥有非对称加密的私钥A和公钥A'
- CA机构对服务端申请的证书明文数据进行hash,形成数据摘要
- 然后对数据摘要用CA私钥A'加密,得到数字签名S
服务端申请的证书明文和数字签名S共同组成了数字证书,这样一份数字证书就可以颁发给服务端了
通过证书解决黑客攻击
在客户端和服务器刚一建立连接的时候,服务器给客户端返回一个证书.
这个证书包含了刚才的公钥,也包含了网站的身份信息.
当客户端获取到这个证书之后,会对证书进行校验(防止证书是伪造的).
- 判定证书的有效期是否过期
- 判定证书的发布机构是否受信任(操作系统中已内置的受信任的证书发布机构).
- 验证证书是否被篡改: 从系统中拿到该证书发布机构的公钥,对签名解密, 得到一个hash值(称为数据摘要), 设为hash1. 然后计算整个证书的hash值,设为hash2. 对比hash1和hash2是否相等. 如果相等, 则说明证书是没有被篡改过的.
黑客有没有可能篡改该证书?
● 黑客篡改了证书的明文: 由于他没有CA机构的私钥,所以无法hash之后用私钥加密形成签名,那么也就没法办法对篡改后的证书形成匹配的签名
● 如果强行篡改,客户端收到该证书后会发现明文和签名解密后的值不一致,则说明证书已被篡改, 证书不可信,从而终止向服务器传输信息,防止信息泄露给黑客
黑客如果掉包整个证书呢?
● 因为黑客没有CA私钥,所以无法制作假的证书(为什么? ) 所以黑客只能向CA申请真证书,然后用自己申请的证书进行掉包, 这个确实能做到证书的整体掉包,但是别忘记,证书明文中包含了域名等服务端认证信息,如果整体掉包,客户端依旧能够识别出来。
● 永远记住: 黑客没有CA私钥,所以对任何证书都无法进行合法修改,包括自己的.