作为一个博客园的老用户,这是第一次在掘金上记录学习日志。像掘金、简书等好的平台,真的产出了不少文章。我也跟着大家在这里记录学习生活,分享给我的Android伙伴们,一起交流学习。
[为什么写Http&Https]
1、作为最基本的网络请求协议,有了解的必要
2、有足够的了解,才可以在实际开发中,做到游刃有余
3、团队中有很多新手,最基本的协议不了解,也是作为知识补充
4、借助公司做知识积累的机会,也重新学习和认识Http & Https
[如果作为新手,需要哪些必备知识]
1、网络请求的模型
说到这里不得说,计算机基础的重要性。首先来看一下OSI和TCP/IP的对比图
从图上我们可以看到网络结构的每一层叫什么名字,都对应什么协议。【有兴趣的小伙伴可以自行搜索每个协议是做什么的,来补充一下基础】
那么,我们网络上的消息是怎么流转的呢?看下图
最后,我们知道了消息要这样传递,我们就得协商并遵守一套规则,不然大家各自弄一个规则,没办法做信息共享和交互了,对不对。所以---》协议,诞生了!也就是上文提到的http、tcp、ip等等
2、什么是HTTP
Hypertext Transfer Protocol,超⽂本传输协议,和 HTML (Hypertext Markup Language 超⽂本标记语⾔)
2.1 HTTP用来做什么
我们打开浏览器,打开我们的开发者工具,随便访问一个网页,我们就看到了浏览器内核渲染引擎渲染的网页,这些网页的内容就是通过http或者https协议请求到的HTML(及其他资源)
2.2 那么我们看一下HTTP的消息是什么格式
借用WIKI上的图片
我们看到了一个客户端(发起请求的参与方)GET请求发出的内容,这个就是报文
那么,服务端(接收消息的参与方)接收到报文之后,解析报文内容,作出对应的响应(response),内容的格式也是类似的:
图中我们看到了HTML,这就是网页上显示的内容。
我们来看一下具体的格式,如图:
2.3 常用网络请求分类
| 请求类型 | 常用场景 | 注意事项 |
|---|---|---|
| GET | 获取消息 | 没有body,请求的参数都在链接的path中 |
| POST | 增改信息 | 请求内容放在了,报文的HEADER下方的Body中 |
| DELETE | 删除信息 | 没有Body,和GET类似 |
| PUT | 修改内容 | 内容在Body中 |
| HEAD | 有时为了获取详情报文的长度等 | 与GET一样,只是响应中没有Body |
具体每一种请求方法的格式可以参考WIKI:en.wikipedia.org/wiki/Hypert…
2.4 相应中的状态码
它是用来干嘛的?告诉你响应报文中的状态
| 状态码 | 意义 |
|---|---|
| 1xx | 临时性消息。如:100 (继续发送)、101(切换协议) |
| 2xx | 成功。200(OK)、201(创建成功)。 |
| 3xx | 重定向。如 301(永久移动)、302(暂时移动)、304(内容未改变) |
| 4xx | 客户端错误。如 400(客户端请求错误)、401(认证失败)、403(被禁⽌)、404(找不到内容)。 |
| 5xx | 服务器错误。如 500(服务器内部错误)。 |
2.5 Header
借用WIKI的图:
其实我为什么这么喜欢WIKI呢,因为国内的文章中有很多引用和翻译有时不太正确,所以要习惯看英文文献。
具体用法可以自行Goole或者Baidu,因为内容太多,而且对应的报文格式也有区别。比如:Content-Type,每一种value,对应的报文都有差别。这部分算是扩展阅读吧,自行查询。
3、为什么有了HTTP,还造HTTPS
我们通过上面HTTP的简单学习,了解到报文中包含了请求和响应信息,大家或许都听过劫持、监听、篡改等,这些都是说的网络中的一些攻击或者威胁,这些都说明别有用心的人利用网络获得或者破坏我们传输的信息。那么,我们是不是就得加密我们的内容呢?
常见的解决办法:1、开发者自己把内容加密,然后去解密。2、通过协议保证私密性。当然还有其他的方式,很学术的就可以自行Google学术去查查。
我们先说一下加密解密的基本知识
往下看
往下看
往下看
是的就是这里
4、加密&解密
我们先来了解一下加密解密的基本知识。
S😯,我讲不了那么学术,我就扣着脚丫子来讲一讲吧~~~~~
4.1 第一种 替换
Alice 和 Bob 两个人通信,都有一个26个字母的表格。
| 原始字母 | 密文字母 |
|---|---|
| a | b |
| b | c |
| c | d |
| ... | ... |
| y | z |
| z | a |
那么,“I Love you”--》"J Mpwf zpv"
从认识的单词变成了我们不认识的单词,没有密码表的人是不是就没办法理解,「表情」“What are you 弄啥嘞!”
4.2 第二种 对称加密
现代数学的发展,催生了一些密码学方法的诞生。我们熟悉的对称加密就是之一。
对称这两个字尤为重要,为什么叫对称呢?
简单地说,就是加密过程和解密过程使用了同一个密钥Key
| 特点 |
|---|
| 速度快 |
| 适合数据量大 |
| 安全性差 |
| 常用:DES(Data Encryption Standard)、3DES(Triple DES)、AES(Advanced Encryption Standard)、Blowfish等。 |
4.3 第三种 非对称加密
1、一对密钥,公钥(公开)加密,私钥(不公开)解密,
2、速度慢
3、适合小数据量
4、安全性高
5、RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等
6、单向函数,将公钥私钥分离,互为公私钥
7、原理:素数,素数相乘的算法形成公钥,分解成原有素数的算法形成私钥,加密是将信息编码时加入素数,解密时如果没有私钥,会因为寻找这个素数时间过长导致没有办法破解。
有兴趣的可以自行搜索,后续文章我还会介绍一些密码学相关的知识:同态加密、不经意传输、混合加密、一次一密、秘密分享等等,这些都是偏理论的东西,但是开发人员了解起来,也不难,而且你会说“这么简单”
简单来讲,Https就是用了非对称加密,先通过非对称加密沟通协商一个对称加密的key,然后再通过对称加密去做消息交互。
实际上,中间会涉及到数字签名、数字证书、Hash指纹等等,相当复杂。我们这次就删繁就简吧!
5、HTTPS和HTTP的主要区别
6.HTTPS的细节
HTTPS在原有的HTTP一层下面,多了一层TLS/SSL层,这一层就是保证安全的。
使用 HTTPS 发送的数据可通过TLS(传输层安全协议)得到保护,该协议可提供三重关键保护:
- 加密 - 对所交换的数据进行加密,使其免受窥探。这意味着,当用户浏览某个网站时,没有人能够“听到”其会话内容,也无法跟踪其在多个网页上的活动,或窃取其信息。
- 数据完整性 - 只要数据在传输期间被修改或损坏(无论有意或无意),都会被检测出来。
- 身份验证 - 证明用户是在与目标网站进行通信,从而保护用户免遭中间人攻击并建立用户信任,进而带来其他商业效益。
TLS握手。
TLS 是一种旨在保护互联网通信安全的加密协议。TLS 握手是启动 TLS 加密通信会话的过程。在 TLS 握手过程中,通信双方交换消息以相互确认,彼此验证,确立它们将使用的加密算法,并生成一致的会话密钥。TLS 握手是 HTTPS 工作原理的基础部分。
TLS 与 SSL的关系
SSL(安全套接字层(www.cloudflare.com/learning/ss… HTTP 开发的原始加密协议。不久前,SSL 被 TLS (传输层安全性)所取代。SSL 握手现在称为 TLS 握手,尽管“SSL”这个名称仍在广泛使用。
TLS 握手有哪些步骤?
以下内容来自www.cloudflare.com/zh-cn/learn…
TLS 握手是由客户端和服务器交换的一系列数据报或消息。TLS 握手涉及多个步骤,因为客户端和服务器要交换完成握手和进行进一步对话所需的信息。
TLS 握手的确切步骤将根据所使用的密钥交换算法的类型以及双方支持的密码套件而有所不同。RSA 密钥交换算法最为常用。具体如下:
- “客户端问候(client hello)” 消息: 客户端通过向服务器发送“问候”消息来开始握手。该消息将包含客户端支持的 TLS 版本,支持的密码套件,以及称为一串称为“客户端随机数(client random)”的随机字节。
- “服务器问候(server hello)”消息: 作为对 client hello 消息的回复,服务器发送一条消息,内含服务器的 SSL 证书、服务器选择的密码套件,以及“服务器随机数(server random)”,即由服务器生成的另一串随机字节。
- 身份验证: 客户端使用颁发该证书的证书颁发机构验证服务器的 SSL 证书。此举确认服务器是其声称的身份,且客户端正在与该域的实际所有者进行交互。
- 预主密钥: 客户端再发送一串随机字节,即“预主密钥(premaster secret)”。预主密钥是使用公钥加密的,只能使用服务器的私钥解密。(客户端从服务器的 SSL 证书中获得公钥。)
- 私钥被使用: 服务器对预主密钥进行解密。
- 生成会话密钥: 客户端和服务器均使用客户端随机数、服务器随机数和预主密钥生成会话密钥。双方应得到相同的结果。
- 客户端就绪: 客户端发送一条“已完成”消息,该消息用会话密钥加密。
- 服务器就绪: 服务器发送一条“已完成”消息,该消息用会话密钥加密。
- 实现安全对称加密: 已完成握手,并使用会话密钥继续进行通信。
所有 TLS 握手均使用非对称加密(公钥和私钥),但并非全都会在生成会话密钥的过程中使用私钥。例如,短暂的 Diffie-Hellman 握手过程如下:
- 客户端问候: 客户端发送客户端问候消息,内含协议版本、客户端随机数和密码套件列表。
- 服务器问候: 服务器以其 SSL 证书、其选定的密码套件和服务器随机数回复。与上述 RSA 握手相比,服务器在此消息中还包括以下内容(步骤 3):
- 服务器的数字签名: 服务器使用其私钥对客户端随机数、服务器随机数及其 DH 参数* 进行加密。加密后的数据用作服务器的数字签名,从而确定服务器具有与 SSL 证书中的公钥相匹配的私钥。
- 确认数字签名: 客户端使用公钥解密服务器的数字签名,验证服务器控制私钥并且是其声称的身份。客户端 DH 参数:客户端将其 DH 参数发送到服务器。
- 客户端和服务器计算预主密钥: 客户端和服务器使用交换的 DH 参数分别计算匹配的预主密钥,而不像 RSA 握手那样由客户端生成预主密钥并将其发送到服务器。
- 创建会话密钥: 与 RSA 握手中一样,客户端和服务器现在从预主密钥、客户端随机数和服务器随机数计算会话密钥。
- 客户端就绪: 与 RSA 握手相同。
- 服务器就绪
- 实现安全对称加密
最终HTTPS的效果
使用 HTTPS 时,流量会经过加密,即使嗅探到数据包或以其他方式截取数据包,它们也会呈现为无意义的字符。我们来看一个例子:
加密前:
这是完全可读的文本字符串
加密后:
ITM0IRyiEhVpa6VnKyExMiEgNveroyWBPlgGyfkflYjDaaFf/Kn3bo3OfghBPDWo6AfSHlNtL8N7ITEw
结语
现在,我们应该有一个整体的概念了吧,我们了解了:
网络模型
什么是http,常用的请求类型、状态码、header等
为什么使用Https,常用的加密措施
Http与Https的简单区别
Https的建立过程
Https的作用