从输入url到数据接受的过程
- 首先在浏览器中输入url地址
- 通过域名解析(DNS)解析出需要访问的服务器IP地址
- 建立TCP的三次握手链接
- 发起http请求
- 服务器响应接收到对应的请求并返回
- 通过返回数据客户端进行处理
那么存在问题是http中的数据安全不能保证,缺点主要有
- 数据为明文,容易非法获取,例如账号密码等
- 通信双方的身份没有确认,无法保证返回的数据是从理想的服务器中返回,中间可能有伪装成源服务器进行数据返回(DOS攻击 大量无意义的请求)
- 无法确认数据内容的完整性,可能被篡改
那么针对这些,出现了基于http的外层加上了ssl的外壳,通过这个外壳,有了上面基于http请求缺点的优化, 1.数据加密 2.身份验证 3.内容完整性确认
HTTP + 加密 + 认证 + 完整性保护 = HTTPS HTTP + SSL = HTTPS
数据加密
概念:
- 公开密钥 ---- 任何人可以获取的密钥。
- 私有密钥 ---- 只有自己知道保存的密钥
- 对称密钥(共享密钥) ----通过使用同一密钥进行加密解密.
- 非对称密钥 ----通过公钥加密,解密时通过私有密钥进行解密.
v1.1 使用对称密钥 ---- 首先通过服务器将共享密钥发送给客户端,客户端将这个密钥接收后进行加密发送给服务器进行解密处理
- 存在问题: 不能确保密钥发送中不被攻击者获取,换句话说 如果能够确保密钥能被安全传送,那么数据也能被安全传输,也就不用加密方式了.
v1.2 使用公开密钥加密 ---- 首先通过服务器发送给客户端一个(单向)公开密钥(这个公开密钥可以被任何人知晓),但是解密必须需要服务器中存在的私有密钥才可以解密,这样就算攻击者获取了公开密钥,但是发送者的信息也是不能解密的.这也称作公开密钥的非对称加密.
- 但是公开密钥加密的处理速度是非常慢的,为了优化https使用了混合
即将v1.1 + v1.2混合 首先通过v1.2公开密钥加密(非对称加密)将v1.1共享(对称)密钥加密进行传输给客户端,之后通信通过对称密钥加密进行传输,简而言之就是通过公开密钥加密的方式确保在发送对称(共享)密钥时是安全的.
存在疑惑: 初始服务器存有私有密钥,客户端通过公开密钥加密发送请求后服务器通过私有密钥解密,将共享密钥如何加密发送给客户端?客户端也有存在私有密钥进行解密吗?如果不是,那么服务器发送的单向公开密钥加密,客户端是如何解密的?
在混合v1.1 + v1.2之后还存在安全问题,攻击者对于客户端伪装成服务器,对于服务器伪装成客户端,对客户端生成攻击者的密钥进行传输通信,而对于服务器伪装成客户端进行数据请求。
针对于这个,出现了证书认证以及数字签名,服务器注册时将公钥和服务器信息上传在某机构中,在客户端请求时将(无法判断真假的)服务器返回的密钥在此机构中查询,判断密钥是否匹配.由此可以判断服务器的真假。