深入理解HTTP/HTTPS协议以及加密原理
文章结构
- 感人小故事: 通过故事,说一说为什么要加密。
- 密码学: 单钥加密&双钥加密。
- 数字签名&数字证书&证书授权中心: 概念解释。
- HTTP: 工作原理,三次握手,四次分手过程。
- HTTPS: HTTPS 是HTTP 和 SSL/TLS的结合。一次HTTPS过程包含两次双钥加密,一次单钥加密。
感人小故事
Section 1:
故事背景:二战期间德军安插在英国的间谍将收集的情报直接传送给大本营。
情报内容: 英国军队将在周末有军事活动。
Section 2:
间谍拍脑袋一想,万一被英国截获了情报,就完蛋了。
于是跟大本营协商了一套加密密码用来加密情报,即使情报被截获,英国佬也不知道是什么意思。
完事大吉...
情报经加密发给大本营Section 3:
由于房东涨租,间谍的活动经费紧张,不得已搬家。用来加密的密码丢失了,被英国得到了,情报又不安全了。
间谍想哭...
加密规则丢失,情报不安全Section 4:
吸取了以往教训,大本营用两套密码(公钥,私钥)分别用于情报的加密和解密。 间谍用大本营给的公钥加密,大本营用私钥解密就看到情报内容了。只要大本营不泄露私钥,情报就是安全的。
间谍开心的笑了...
公私钥加解密情报ps: 公钥和私钥是一一对应的,不可被模仿的。 公钥加密的只能用私钥解开,反之亦然。
Section 5:
英国人情报局:卧槽,搞不到情报,我就要下岗了。怎么办,怎么办。灵机一动,来一出偷梁换柱的戏法。用不为人知的手段换了间谍的公钥,间谍用这个公钥加密了情报发给大本营,中途就被英国截获,用自己的私钥就能解密,获得情报内容。用私钥加密回信给德国间谍: “小样,你的智商又一次没碾压”。
间谍OS: mmp,太可恶了,心中一万头草泥马跑过...
Section 6:
大本营安慰间谍ing......
大本营对间谍说:我以后回信都用Hash函数生成摘要,用私钥对摘要加密生成数字签名,并将这个数字签名随同加密的回信一起给你。
间谍收到回信,先用公钥解密数字签名,得到摘要。就确定了该信件是大本营发的(因为能用公钥解密)。
再对信件用Hash函数生成摘要,将得到的摘要和解密得到的摘要对照。如果一致,就确定信就没被改过。
间谍突然想到: 咦,不对,没解决问题啊。我的公钥如果没被替换,做这些毫无意义,公钥被替换了,做这些也毫无意义。
大本营一帮蠢货,😌,难受ing......
大本营理想的情景 英国人破译的情景问君能有几多愁?恰似一江春水向东流。
一切皆枉然,奈何徒增悲伤...
Section 8:
间谍内心os: 不能靠大本营的一帮蠢货,还是得靠我!
熊熊斗志在燃烧🔥🔥
只要让我(间谍)能验证“数字签名”真伪就真的什么都不怕了。
要求大本营找一个靠谱(公信力强)的单位(称为“证书中心”,简称CA),为大本营的公钥做认证并给到自己。CA用自己的私钥对大本营的公钥和一些其他相关信息一起加密,生成了“数字证书”。
大本营回信的时候,附带上数字签名,再加上CA的数字证书。间谍收到信,用CA的公钥解开数字证书拿到大本营的公钥,就能证明“数字签名”是大本营的。
这下真的安全了...
ps:
CA是被认可的有公信力的组织。理论上不会作假,也没法伪装的。
CA的公钥是公之于众的。
CA的公钥是可查的,可验证的,没法模仿的。
密码学
加密方法
- 单钥加密:又称为对称加密。加密解密用同一套密码。一旦密钥泄漏,密码也就被破解。
- 双钥加密:又称非对称加密。加密解密用两套密码。一把是公开的公钥,还有一把是不公开的私钥。
说明:
- 公钥和私钥是一一对应的关系,有一把公钥就会有一把独一无二的私钥。反之也成立。
- 所有的公钥私钥对都是不同的。
- 用公钥可以解开私钥加密信息,反之也成立。
- 同时生成公钥私钥相对比较容易,但是从公钥推到出私钥是不可能的。
- 在双匙体系中,公钥用来加密信息,私钥用来做数字签名。
数字签名&数字证书&证书授权中心
数字签名
数字签名(又称公钥数字签名)是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。
简单地说,所谓数字签名就是附加在数据单元上的一些数据,或是对数据单元所作密码变换。这种数据或变换允许数据单元的接收者用以确认数据单元的来源和数据单元的完整性并保护数据,防止被人(例如接收者)进行伪造。
数字证书
每个人都有一对“钥匙”(数字身份),其中一个只有她/他本人知道(私钥),另一个公开的(公钥)。签名的时候用私钥,验证签名的时候用公钥。
又因为任何人都可以落款声称她/他就是你,因此公钥必须向接受者信任的人(身份认证机构)来注册。注册后身份认证机构给你发一数字证书。对文件签名后,你把此数字证书连同文件及数字签名一起发给接受者,接受者向身份认证机构求证是否真地是用你的私钥签发的文件。
证书授权中心
证书授权中心是管理和签发安全凭证和加密信息安全秘钥的网络机构。负责生产、分配并管理所有参与网上交易的个体所需要的数字证书。
任何人都可以生成自己的公钥私钥对,所以为了防止有人散布伪造的公钥骗取信任,就需要一个可靠的第三方生成经过认证的公钥私钥对,目前主要的数字服务认证商是美国加州的Verisign公司,它的主要业务是分发RSA数字证书。
HTTP
简介
- HTTP协议是用于从WWW服务器传输超文本到本地浏览器的传送协议。
- HTTP协议永远都是客户端发起请求,服务器回送响应。
- HTTP是基于TCP协议的,发送数据之前需要建立好连接。
- 默认HTTP的端口号为80
TCP协议
TCP 负责客户端和网络软件之间的通信。
- 短连接: HTTP/1.0中默认使用短连接,客户端和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。短连接对服务端来说实现起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段,但是如果用户访问量很大,往往可能在很短的时间内需要创建大量的连接,造成服务端响应过慢。
- 长连接: HTTP/1.1中默认使用长连接。长连接可以省去较多的和TCP建立和关闭连接的操作,节约时间。但是如果用户量太大容易造成服务器负载过高最终导致服务不可用。
http的操作过程
- 获取服务器的IP地址
客户端分析指向页面的URL,客户端向DNS请求解析域名所对应的服务器地址,DNS系统解析出服务器的IP地址并返回服务器IP给客户端。
http://host.com:8080/page.html解析结果:
协议名 | 主机名 | 端口号 | 对象路径 |
---|---|---|---|
http | host.com | 8080 | page.html |
-
客户端与服务器的进程建立TCP链接
也叫三次握手连接,默认端口号80.
SYN: 表示连接请求 ACK: 表示确认 FIN: 表示关闭连接 seq:表示报文序号 ack: 表示确认序号
- 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
- 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack (number )=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
- 第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
- 客户端发送请求命令
建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URI:Uniform Resource Identifier)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。 - 服务器响应
服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
实体消息是服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据 - 服务器关闭TCP连接
一般情况下,一旦服务器向客户端发送了请求数据,它就要关闭TCP连接,然后如果客户端或者服务器在其头信息加入了这行代码Connection:keep-alive
,TCP连接在发送后将仍然保持打开状态,于是,客户端可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
SYN: 表示连接请求 ACK: 表示确认 FIN: 表示关闭连接 seq:表示报文序号 ack: 表示确认序号
- 第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送。
- 第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1
- 第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送。
- 第四次挥手:Client收到FIN后,接着发送一个ACK给Server,确认序号为收到序号+1。
- 客户端解析信息,做对应的处理。
Https
什么是HTTPS?
https简单的说就是http的安全版本,因为Http协议的数据都是明文进行传输的。为了安全传输敏感数据,在http上添加了一个安全传输层(SSL / TLS协议),对所有数据都加密再进行传输。
- SSL的全称是Secure Sockets Layer,即安全套接层协议,是为网络通信提供安全及数据完整性的一种安全协议。
- TLS的全称是Transport Layer Security,即安全传输层协议。它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。它们所支持的加密算法不同,所以TLS与SSL3.0不能互操作。虽然如此,但是在我们理解HTTPS的过程中,我们可以把SSL和TLS看做是同一个协议。
HTTPS为了兼顾安全与效率,同时使用了对称加密和非对称加密。数据是被对称加密传输的,对称加密过程需要客户端的一个密钥,为了确保能把该密钥安全传输到服务器端,采用非对称加密对该密钥进行加密传输,总的来说,对数据进行对称加密,对称加密所要使用的密钥通过非对称加密传输。
HTTPS加密流程- 客户端发起请求
客户端开始请求接口,连接到服务器的443端口。 - 服务端加密公钥(非对称加密)
服务器端有一个密钥对,即公钥和私钥,是用来进行非对称加密使用的。CA用私钥加密服务端的公钥和其他相关信息生成数字数字证书。 - 传送数字证书
服务器将这个数字证书发送给客户端。 - 客户端解析证书(非对称加密)
客户端用CA的公钥解析证书,验证证书是否正确(颁发证书的机构,过期时间等),拿到服务器的公钥。然后生成一个随机值,用公钥对随机值进行加密。 - 传送加密信息
客户端将加密的随机值传送给服务端。 - 服务端加密信息(对称加密)
服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密。 - 传输加密后的信息
将加密的信息发送给客户端。 - 客户端解密信息
客户端用之前生成的随机值解密服务端传过来的信息,于是获取了解密后的内容。
整个过程第三方即使监听到了数据,也束手无策。
HTTPS总结
- HTTPS = HTTP + SSL/TLS
- HTTPS的过程包含两次非对称加密(加密公钥和加密客户端生成的私钥),一次对称加密(传输信息的对称加密)。