HTTPS的安全性
HTTP
简介
- HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范,默认80端口。
- 无连接无状态
HTTP报文
状态行、请求头、消息主体
1 | <method> <request-URL> <version> |
GET
1
2
3
4
5
6GET /books/?sex=man&name=Professional HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-AlivePOST
1
2
3
4
5
6
7
8
9
10POST / HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive
sex=man&name=Professional
状态行:请求方式+URL+HTTP版本号
请求头:编码格式、cookie、包长
请求体:内容
响应报文
状态行:协议版本、数字形式的状态代码、及相应的状态描述
响应头(Response Header)
响应正文
会话跟踪
- 什么是会话?
客户端打开与服务器的连接发出请求到服务器响应客户端请求的全过程称之为会话。
- 什么是会话跟踪?
会话跟踪指的是对同一个用户对服务器的连续的请求和接受响应的监视。
- 为什么需要会话跟踪?
浏览器与服务器之间的通信是通过HTTP协议进行通信的,而HTTP协议是”无状态”的协议,它不能保存客户的信息,即一次响应完成之后连接就断开了,下一次的请求需要重新连接,这样就需要判断是否是同一个用户,所以才有会话跟踪技术来实现这种要求。
会话跟踪常用的方法:
- session
每一个用户都有一个不同的session,各个用户之间是不能共享的,是每个用户所独享的,在session中可以存放信息。
在服务器端会创建一个session对象,产生一个sessionID来标识这个session对象,然后将这个sessionID放入到Cookie中发送到客户端,下一次访问时,sessionID会发送到服务器,在服务器端进行识别不同的用户。
Session的实现依赖于Cookie,如果Cookie被禁用,那么session也将失效。
- cookie
- url重写
- 隐藏域表单提交
HTTPS
几个重要概念描述
对称密钥:又称为共享密钥加密,客户端和服务端都共有,加密解密的过程都是相同的。
非对称加密:服务端生成一组秘钥,公钥发放给客户端,私钥由服务端自己保留。只要服务器的私钥不丢失,即使公钥中间被拦截,也无法破解。
数字签名:私钥签名,公钥验证。解决数据在服务端和客户端在传输数据的过程中有可能被人替换的问题。
3.1 服务端对报文进行hash生成摘要信息(digest),用私钥对此进行签名,将签名+报文内容发送给客户端。
3.2 客户端将签名提起出来,使用公钥将此解密,如果能正常地解密出来digest2,那么就能确认是对方发的。
3.3 客户端同样对报文进行hash,得出数字摘要(digest1),如果digest1和digest2相等,则说明没有篡改。数字证书:开始时,客户端是没有公钥的,需要向服务端申请拿到公钥,可是在这个过程中有可能被中间人所拦截,给你一个假的公钥,自己保留一个对应的假私钥,用假私钥解密出客户端的报文,篡改,然后用真公钥传送给服务端。问题在于,客户端所得到的公钥是否真的就是服务端发过来的公钥。
所以,不能直接由服务端发放公钥,而是第三方使用私钥对服务端的公钥加密,然后发放给客户端一个第三方公钥去解密,这个叫证书。
思考设计
- 服务端对于每个客户端,维持一个对称加密算法。但是协商对称加密的过程是不安全的,中间有可能被截获。
解决:使用非对称加密算法进行对称加密算法协商过程。
- 对于每个客户端都要有不同的对称加密方式,而且不被窃取
每次ssl握手都有随机数生成,在第四次握手后,双方都有三个随机数,通过这三个随机数生成加密方式
- 如何得到公钥?公钥有被掉包的危险
CA数字证书的私钥对服务端的公钥的加密,客户端用数字证书的公钥解密,拿到公钥
- 第三方机构不止授权一个网站,授权多个服务器网站,客户端拿到第三方的公钥,可以解密授权的所有证书,而得到公钥, 此时中间人可以调包证书,客户端一样可以解密。
数字签名确保数字证书的权威性
:将证书内容进行一次hash,然后通过CA的私钥加密,得到数字签名,附在证书的末尾,发给服务端。浏览器收到服务端证书,用数字证书的公钥对数字签名进行解密,得到hash1;然后按照证书上指定的hash算法对数字证书内容进行一次hash得到hash2,判断hahs1和hash2是否相同。
HTTPS的优势:
- 通讯过程的hash生成的摘要,保证数据完整性
- 握手过程的非对称加密,传输过程的对称加密,保证数据私密性
- 证书保证双方身份的真实性
HTTPS过程
- 建立服务器443端口连接
- SSL握手:随机数,证书,密钥,加密算法
- 发送加密请求
- 发送加密响应
- 关闭SSL:服务端会话秘钥生成,发送给客户端
- 关闭TCP