目录
一、概念
1、HTTPS
2、加密解密
3、加密的必要性
4、常见的加密方式
4.1、对称加密
4.2、非对称加密
5、数据摘要 && 数据指纹
6、数字签名
二、HTTPS的工作过程
1、只使用对称加密
2、只使用非对称加密
3、双方都使用非对称加密
4、非对称加密 + 对称加密
5、中间人攻击
6、证书
6.1、CA认证
6.2、理解数据签名
7、非对称加密 + 对称加密 + 证书认证
三、证书可靠性解释
1、中间人有没有可能篡改证书
2、中间人掉包整个证书
四、补充内容
1、为什么摘要内容在网络传输的时候一定要加密形成签名
2、为什么签名不直接加密,⽽是要先hash形成摘要
3、常见的摘要算法
4、完整流程
五、总结
HTTPS也是⼀个应⽤层协议,是在HTTP协议的基础上引⼊了⼀个加密层。直接使用HTTP协议进行传输,可能会被第三方抓取数据,并直接读取正文中的明文信息。
而使用HTTPS协议发送数据,会在应用层先把数据传递给SSL/TLS,进行加密操作,完成后才继续向下传递给传输层。接收数据时也同样,传输层要先把数据传递给SSL/TLS,解密完成后再传递到应用层。
HTTPS的端口号是443。
加密:把 明⽂(要传输的信息)进⾏⼀系列变换,⽣成 密⽂。
解密:把 密⽂ 再进⾏⼀系列变换,还原成 明⽂。
在这个加密和解密的过程中,往往需要⼀个或者多个中间的数据,辅助进⾏这个过程,这样的数据称为 密钥 。
因为http的内容是明⽂传输的,明⽂数据会经过路由器、wifi热点、通信服务运营商、代理服务器等多个物理节点,如果信息在传输过程中被劫持,传输的内容就完全暴露了。劫持者还可以篡改传输的信息且不被双⽅察觉,这就是 中间⼈攻击 ,所以我们才需要对信息进⾏加密。
对称加密其实就是通过同⼀个 "密钥" ,把明⽂加密成密⽂,并且也能把密⽂解密成明⽂。
摘要经过加密,就得到数字签名。
既然要保证数据安全,就需要进⾏"加密"。⽹络传输中不再直接传输明⽂了,⽽是加密之后的"密文"。加密的⽅式有很多,但是整体可以分成两⼤类:对称加密 和 非对称加密。
如果通信双方都各⾃持有同⼀个密钥X,且没有别⼈知道,这两⽅的通信安全当然是可以被保证的(除非密钥被破解)。
引⼊对称加密之后,即使数据被截获,由于⿊客不知道密钥是什么,因此就⽆法进⾏解密,也就不知道请求的真实内容是什么了。
但事情没这么简单,服务器同⼀时刻其实是给很多客⼾端提供服务的。这么多客⼾端,每个⼈⽤的秘钥都必须是不同的(如果是相同那密钥就太容易扩散了,⿊客就也能拿到了)。因此服务器就需要维护每个客⼾端和每个密钥之间的关联关系,这也是个很⿇烦的事情。
⽐较理想的做法,就是能在客⼾端和服务器建⽴连接的时候,双⽅协商确定这次的密钥是什么。
但是如果直接把密钥明⽂传输,那么⿊客也就能获得密钥了。此时后续的加密操作就形同虚设了。
所以只使用对称加密的方式是不可以的。
鉴于非对称加密的机制,如果服务器先把公钥以明文方式传输给浏览器,之后浏览器向服务器传数据前都先⽤这个公钥加密好再传,从客⼾端到服务器信道似乎是安全的(有安全问题),因为只有服务器有相应的私钥能解开公钥加密的数据。
但是服务器到浏览器的这条路怎么保障安全?
如果服务器⽤它的私钥加密数据传给浏览器,那么浏览器⽤公钥可以解密它,而这个公钥是⼀开始通过明⽂传输给浏览器的,若这个公钥被中间⼈劫持到了,那他也能⽤该公钥解密服务器传来的信息了。
所以只使用非对称加密的方式是不可以的。
这种方式看似可行,但是效率太低了,而且这种方式仍然有安全问题。
先解决效率问题:
由于对称加密的效率⽐非对称加密⾼很多,因此只是在开始阶段协商密钥的时候使⽤非对称加密,后续的传输仍然使⽤对称加密。
看似方案4已经很完善了,但是仍然有安全问题。
Man-in-the-MiddleAttack,简称 “MITM攻击” 。
确实,在⽅案4中,客⼾端获取到公钥S之后,对客⼾端形成的对称秘钥X⽤服务端给客⼾端的公钥S进⾏加密,中间⼈即使窃取到了数据,此时中间⼈确实⽆法解出客⼾端形成的密钥X,因为只有服务器有私钥S'。
但是中间⼈的攻击,如果在最开始握⼿协商的时候就进⾏了,那就不⼀定了,假设hacker已经成功成为中间⼈。
问题本质在于客⼾端⽆法确定收到的含有公钥的数据报⽂,就是⽬标服务器发送过来的。
服务端在使⽤HTTPS前,需要向CA机构申领⼀份数字证书,数字证书⾥含有证书申请者信息、公钥信息等。服务器把证书传输给浏览器,浏览器从证书⾥获取公钥就⾏了,证书就如⾝份证,证明服务端公钥的权威性。
这个 证书 可以理解成是⼀个结构化的字符串,⾥⾯包含了以下信息:
需要注意的是:申请证书的时候,需要在特定平台⽣成查,会同时⽣成⼀对⼉密钥对⼉,即公钥和私钥。这对密钥对⼉就是⽤来在⽹络通信中进⾏明⽂加密以及数字签名的。
其中公钥会随着CSR⽂件,⼀起发给CA进⾏权威认证,私钥服务端⾃⼰保留,⽤来后续进⾏通信(其实主要就是⽤来交换对称秘钥)。
可以使⽤在线⽣成CSR和私钥:https://myssl.com/csr_create.html。
形成CSR之后,后续就是向CA进⾏申请认证,不过⼀般认证过程很繁琐,⽹络各种提供证书申请的服务商,⼀般真的需要,直接找平台解决就⾏。
签名的形成是基于非对称加密算法的,注意,目前暂时和https没有关系,不要和https中的公钥私钥搞混了。
当服务端申请CA证书的时候,CA机构会对该服务端进⾏审核,并专⻔为该⽹站形成数字签名,过程如下:
细节说明:
服务端申请的证书明⽂和数字签名S共同组成了数字证书,这样⼀份数字证书就可以颁发给服务端了。
在客⼾端和服务器刚⼀建⽴连接的时候,服务器给客⼾端返回⼀个证书,证书包含了之前服务端的公钥,也包含了⽹站的⾝份信息。
客⼾端进⾏认证:
当客⼾端获取到这个证书之后,会对证书进⾏校验(防⽌证书是伪造的):
因为如果不加密,就意味着CA放弃使用私钥,那么证书就可以被中间人修改了。
为了缩⼩签名密⽂的⻓度,加快数字签名的验证签名的运算速度。
常⻅的摘要算法有:MD5 和 SHA 系列。
以 MD5 为例,我们不需要研究具体的计算签名的过程,只需要了解 MD5 的特点:
左侧都是客⼾端做的事情,右侧都是服务器做的事情:
HTTPS ⼯作过程中涉及到的密钥有三组: