HTTPS比HTTP安全,它的安全在于通信过程被加密。然而加密算法是用对称加密,也就是说,客户端和服务端采用一个相同的密钥。为了让双方得到这个密钥,前期就有一个很重要的工作:协商密钥。
现在我们简单模拟一下通信过程:
- 客户端:hi,我准备跟你(xx.com)建立HTTPS通信。
- 服务端:好的,我就是xx.com,这是我的证书,你验证一下。
- 客户端:验证通过了,你的确是xx.com,我把密钥发给你,下面的通信咱们就加密了。
- 服务端:s&&(*3u247(
- 客户端:(&DY&#%%&#
1)重要的过程:https要证明自己是合法的,证书+链式验证
2)数字证书的组成
-
公钥:Public-Key
-
签名:Signature(签名算法)
-
签名算法: Signature Algorithm: sha256WithRSAEncryption
-
证书颁布机构:Issuer
-
过期时间:Validity
-
其他...
3)签名算法的签名、校验过程
//签名
sign = RSA_Encrypt(sha256(content), privateKey)
//校验签名
sha256_Content = RSA_Decrypt(sign, publicKey)
sha256_Content ?= sha256(content)
-
在非对称加密体系中,私钥用来签名,公钥用来校验签名。
-
-
ROOT必须可靠可信任,并且证书链不能断掉(否则验证失败)
4)https的SSL握手过程(在tcp三次握手的基础上增加的)
-
https在http的三次握手的基础之上,增加了SSL握手,来保证整个过程中数据传输的安全性
-
浏览器与网站互相发送加密的握手消息并验证,目的是为了保证双方都获得了一致的密码,并且可以正常的加密解密数据,为后续真正数据的传输做一次测试。
-
流程:
-
客户端向服务端发送客户端支持的加密算法、Hash算法
-
服务端选择合适的加密算法、hash算法,将对应的证书发送给客户端
-
客户端验证证书、生成随机字符串(用来进行对称加密)
-
客户端生成握手信息,使用Hash算法取Hash、使用随机字符串加密握手信息和握手信息的hash值( 这里之所以要带上握手信息的HASH是因为,防止信息被篡改。如果信息被篡改,那么服务端接收到信息进行HASH时,就会发现HASH值和客户端传回来的不一样。这里就保证了信息不会被篡改。)
-
服务端接收加密信息,解密得到客户端的随机字符串,解密握手信息和握手信息hash值,对握手信息进行hash,对比客户端传回来的hash
-
服务端同样使用随机字符串加密握手信息和握手信息hash值给客户端
-
客户端验证服务端的握手信息(同样通过hash值避免被篡改)
-
后续:使用随机字符串进行加密通信
5)https的防劫持
https://www.jianshu.com/p/13a1b955d095
DNS劫持与内容劫持
- DNS劫持(黑客使用私人服务器与浏览器 + 真实服务器 进行连接,作为中间者)一般不会发生,因为黑客需要有CA证书,这个一般不能伪造
- 除非浏览器自身信任、接受了黑客的自签名证书
- 内容劫持:作为一个中间人,你没有服务器私钥A,是不能解密客户端发送的内容的,如果你没有客户端自己生成的密钥B,所以你也不能解密客户端发过去的内容的。
6)http+https的风险
HTTPS只针对传输内容进行加密,保证的是客户端和网站之间的信息就算被拦截也无法破解。
如果不是全站HTTPS,仅仅只是在登录页采用HTTPS,那些HTTP连接的页面同样是危险的,从HTTP->HTTPS跳转依然可能被劫持。国内的部分银行就是这样,对安全性的考量还比不上百度,百度早就全站HTTPS了。