背景知识
·对称加密:通信双发使用相同的密钥对传输的数据进行加密和解密。(加密解密速度快;难以将密钥隐秘的传达给另一方;通信的一方要为所有想与之通信的另一方维护不同的对称密钥)
·非对称加密:分为公钥和私钥。通信的一方持有私钥,并将公钥分发给所有想与之通信的另一方。使用公钥加密的密文仅可以由私钥进行解密,使用私钥加密的密文仅可以由公钥进行解密。常用的非对称加密算法有RSA。(加密解密速度慢;直接将公钥公之于众,不需要隐秘的传达;通信的一方只需要维护一个私钥即可)
·密码散列函数:经过密码散列函数处理后的数据(也称为摘要)具有如下两个特点。(i).该摘要无法被还原为原数据。(ii).数据不同,摘要一定不同;数据相同,摘要一定相同。
(常用的消息摘要算法,如MD5,SHA-1)
·数字证书:由权威机构对服务端的现实身份进行认证后,颁发给该服务端的数字证书。证书中包含的信息有:该服务端的公钥、服务端身份信息、证书签发机构信息、证书有效期。
为了防止证书被伪造,数字证书将会以如下两个部分呈现:(i).证书原文明文 (ii). 经过证书签发机构所持私钥加密过的证书摘要。
查看证书的一方只需要经过如下三步即可确认证书的真伪:(i).对获取到的证书原文明文使用密码散列函数,得到其摘要。(ii).使用证书签发机构的公钥对获取到的加密过的证书摘要进行解密,获取摘要明文。(证书签发机构的公钥内嵌于浏览器中)(iii).对比两份摘要,若相同,则可以确保证书是由权威机构颁发且未被篡改。
若获取到的证书是是由非权威机构发放的伪造证书,由于非权威机构无法获取到权威机构的私钥,其无法正确加密证书的摘要。使用内嵌于浏览器中的权威机构的公钥,将无法对其进行正确解密。这确保了证书是由权威机构颁发的。
若获取到的证书明文经过了篡改,则一定会导致其生成的摘要发生变化,使得篡改后的证书生成的摘要和解密后得到的摘要不一致。要使其一致,篡改者必须对篡改后的证书重新生成摘要并加密,而因为篡改者无法获取到权威机构的私钥,其无法进行正确加密。这确保了证书是未被篡改的。
证书由权威机构发放且未被篡改,确保了证书中给出的公钥的正确性。使用该公钥进行加密的数据,只会被该公钥对应的私钥的持有者知晓,而该私钥的持有者是经过权威机构认证的可信靠的。
·消息认证码(MAC,Message Authentication Code):消息认证码用于检测消息是否被篡改。将发送的消息与一个对称的密钥进行级联后,使用密码散列函数对其生成的摘要,就是该消息的认证码。发送方将消息与该消息的认证码一同发送给接收方,接收方通过相同的操作(将接收到的消息与密钥级联并生成其摘要),将得到的摘要与接收到的认证码进行比较,即可知道接收到的消息是否被篡改。
若获取到的消息经过了篡改,则会导致接收方计算出来的摘要与认证码不一致。要使其一致,篡改者必须对篡改后的消息重新生成其认证码,而因为篡改者无法获取到密钥,其无法正确生成认证码。这确保了消息是未被篡改的。
HTTPS协议即 HTTP协议+TLS(Transport Layer Security)/SSL(Secure Sockets Layer)协议
(SSL协议是TLS协议的前身)
TLS协议的加入,为HTTP协议提供了如下三个特性,来保证HTTP报文传输的安全性:
(i). 身份验证:对与客户端进行通信的服务端的身份进行验证。(通过服务端发送的数字证书来验证对方身份)
(ii). 加密:对传输的信息进行加密,以确保信息无法被除客户端和服务端的第三方知晓。(首先使用非对称加密算法来传达要使用的对称密钥,之后使用对称加密算法传递数据)
(iii). 数据完整性:保证传输的数据不被篡改,使报文能完整的送达。(每次发送数据都会附上该段数据的MAC)
(注:为了防止攻击者将客户端发送的某段数据反复的发送给服务端——分组重放攻击,数据、密钥、序号三者级联后生成的摘要将会作为该数据的MAC。序号的加入,使得即使是完全相同的消息,其MAC也不会相同,重放的消息将无法通过MAC的验证)
HTTPS的四次握手过程:
客户端:发送客户端支持的加密算法的列表、一个不重数(每次请求发送的不重数不会重复)
服务端:发送服务端的证书、从客户端发来的加密算法列表中选择的算法、一个不重数。
客户端:发送经过公钥加密后的一个前主密钥。
服务端和客户端:同时向对方发送一个在握手阶段双发发送和接收到的所有报文的MAC。
会话阶段:
客户端和服务端会联合自己和对方的不重数以及前主密钥来生成主密钥,并将该主密钥切片为四份:会话密钥A、会话密钥B、MAC密钥A、MAC密钥B。
客户端:(数据 +(数据+MAC密钥A)-> MAC)-> 使用会话密钥A加密 -> 发送
服务端: 使用会话密钥A解密 -> (数据+MAC)
compare((数据+MAC密钥A)-> MAC,MAC)
服务端:(数据 +(数据+MAC密钥B)-> MAC)-> 使用会话密钥B加密 -> 发送
客户端: 使用会话密钥B解密 -> (数据+MAC)
compare((数据+MAC密钥B)-> MAC,MAC)
不重数的作用:序号的加入可以防止分组重放攻击,而不重数用于防止连接重放攻击(攻击者记录下整个会话中客户端发送的报文,并在客户端结束与服务端的会话后,重放整个会话过程)。不重数的加入使得每次会话的主密钥一定不同,避免了连接重放攻击。
最后互发MAC的作用:在握手阶段后,服务端和客户端才得到了主密钥,来确保数据传输的安全性,而在握手阶段,双方的通信是有可能被篡改的。最后互发的MAC用于验证在握手阶段双方发送和接收的所有报文都未被篡改。