HTTPS = HTTP + SSL
HTTP协议是明文传输的,也就是说当数据包使用HTTP协议进行传输的时候,如果数据包中途被截下来了,那么里面的数据(明文)就会完全暴露。因此,如果数据包里面存放着用户的帐号和密码,就可以认为用户的帐号和密码已经泄漏了。
HTTPS协议则使用了SSL对数据进行加密,即使数据被拦截下来,如果没有解密的密钥,也无法得知用户的数据。
RSA
RSA是一种非对称加密的算法,所谓非对称加密算法,就是用于加密解密的密钥有两个,即公钥和私钥,用公钥加密过的数据,只有私钥才能解密,用私钥加密过的数据,只有公钥才能解密。(对称加密算法就是说用于加密解密的只有一个密钥,密钥既能加密数据,又能解密数据)
公钥是可以公开的,别人知道也无所谓,私钥则要存储在安全的地方,不能泄漏。
考虑一下在客户端与服务器之间RSA的应用场景。
- 客户端向服务器发送数据
- 因为服务器的公钥是公开的,所以客户端很容易就能获取得到服务器的公钥。客户端利用服务器的公钥加密数据,这些数据只有存储在服务器的私钥才能解密。
- 服务器向客户端发送数据
- 服务器在向客户端发送数据的时候,除了用私钥加密以外,还要生成一个数字签名。
- 什么是数字签名?服务器会使用hash函数对向客户端发送的数据生成一个摘要(digest),然后用服务器的私钥加密这一个digest,得到的就是数字签名了。
- 当客户端拿到服务器发送的数据后,对数据使用相同的hash函数加密一遍,和用公钥解密的digest进行对比,如果核对一致则说明中途传输的数据没有被篡改。
- 考虑第三种情况,如何确保你拿到的服务器公钥确实是正确的服务器的公钥呢? 即有人将其他的服务器的公钥给了客户端,使客户端误以为自己在跟正确的服务器进行交互。(攻击者可以在代理服务器层拦截客户端的请求,再重定向到自己的服务器)
- 这时候我们需要一个权威的第三方机构(CA)确认这一个公钥确实是真实的服务器的公钥,服务器将自己的公钥和一些私人信息发给CA,CA用自己的私钥将这些数据加密之后就是数字证书(SSL证书)。
- 当服务器向客