网络基础
OSI 七层模型
应用层
表示层
会话层
传输层
网络层
数据链路层
物理层
Socket
TCP/UDP
TCP/IP
TCP/IP 是互联网相关的各类协议族的总称
TCP/IP 概念层模型
应用层
应用层决定了向用户提供应用服务时通信的活动。
TCP/IP协议族内预存了各类通用的应用服务。比如:FTP(File Transfer Protocol) 文件传输协议、DNS(Domain Name System) 域名系统 就是其中两类。
传输层
传输层对上层应用层,提供处于网络连接中的两台主机之间的数据传输。
在传输层有两个性质不同的协议:TCP(Transmission Control Protocol) 传输控制协议 和 UDP(User Data Protocol) 用户数据报协议。
网络层
网络层(又名网络互连层),是用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(所谓的传输路线)到达对方主机,并把数据包传送给对方。
数据链路层
用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,网卡),及光纤等物理课件部分(还包括连接器等一切传输媒介)。硬件上的范畴均在链路层的作用范围之内。
HTTP/HTTPS
HTTP(HyperText Transfer Protocol) 超文本传输协议
HTTP 和 HTML(Hypertext Markup Language 超文本标记语言)一起诞生,用于网络上请求和传输HTML内容。
HTTPS
HTTPS并非应用层的一种新协议,只是HTTP通讯接口部分由SSL/TLS协议代替,通常HTTP直接和TCP通信,当使用SSL/TLS时,则变成先和SSL/TLS通信,再由SSL/TLS和TCP通讯,因此HTTP其实就是披上SSL保护外衣的HTTP。
HTTPS 的优势
- 内容加密,建立一个信息的安全通道,来保证数据传输过程的安全性。
- 身份认证,确认网站的真实性。
- 数据完整性,防止内容被第三方冒充或者篡改。
HTTP1.0
HTTP1.0 诞生于 1996年
- 使用 header 里的 If-Modified-Since、Expires 来做为缓存判断的标准
HTTP1.1
HTTP1.1 诞生于 1999年
- 引入了更多的缓存控制策略,例如:Entity tag、If-Unmodified-Since、If-Match、If-None-Match
- 支持 range 206 Partial Content
- 新增 24个错误码,409 Conflict 410 Gone
HTTP2
HTTP2 诞生于 2015年
HTTP报文结构
Request Methods
- GET 获取资源;没有Body
- POST 增加或修改资源;有Body
- PUT
- DELETE
- HEAD
Status Code(状态码)
HTTP状态码是对结果做出类型化描述,它由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP状态码分为5中类型:
分类 | 分类描述 |
---|---|
1xx | 临时性信息,服务器收到请求,需要请求者继续执行操作 |
2xx | 成功,操作被成功接收并处理 |
3xx | 重定向,需要进一步的操作以完成请求 |
4xx | 客户端错误,请求包含语法错误或无法完成请求 |
5xx | 服务器错误,服务器在处理请求的过程中发生了错误 |
Header
HTTP消息的元元素 (metadata)
加密
对称加密
对称加密,也叫私钥加密,是指加密和解密使用相同的密钥的加密算法。就是加密密钥能够从解密密钥中推算出来,同时解密密钥也可以从加密密钥中推算出来。常见的对称加密有DES(Data Encryption Standard)
、AES(Advanced Encryption Standard)
、RC4、IDEA
。
非对称加密
非对称加密算法有两个秘钥:公开秘钥(public key)和私有秘钥(private key),并且公开秘钥和私有秘钥是成对出现的。
数字摘要
数字摘要是采用单项Hash函数将需要加密的明文”摘要”成一串固定长度(128位)的密文,这一串密文又称为数字指纹,它有固定的长度,而且不同的明文摘要成密文,其结果总是不同的,而同样的明文摘要必定一定。数字摘要是https能确保数据完整性和防篡改的根本原因。常用的摘要主要有MD5
、SHA1
、SHA256
等。
数字签名
数字签名技术是对”非对称密钥加解密”和”数字摘要”两项技术的应用,它将摘要信息用发送者的私钥加密,与原文一起传送给接受者。接受者只有用发送者的公钥才能解密被加密的摘要信息,然后用Hash函数对收到的原因产生一个摘要信息,与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输的过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性。
```flow
st=>start: 明文
st2=>start: Hash运算
st3=>start: 摘要
st4=>start: 私钥加密
e=>end: 数字签名
st(right)->st2(right)->st3(right)->st4(right)->e(right)
```
注意:数字签名只能验证数据的完整性,数据本身是否加密不属于数字签名的控制范围
数字证书
为了确保请求方的公钥一定是目标主机发送的,防止目标主机本身从事窃取用户信息的不正当行为,这时候,我我们需要一个权威的第三方机构(一般由政府机构审核并授权的机构)来统一对外发送主机机构的公钥,只要请求方这种机构获取公钥,就能避免上述问题。
数字证书的颁发过程
数字证书包含哪些内容
QA
-
HTTPS可以抓包吗? HTTPS的数据是加密的,常规下抓包工具代理请求后抓到的包内容是加密状态,无法直接查看。但是,可以通过抓包工具来抓包。它的原理其实是模拟一个中间人。 通常HTTPS抓包工具的使用方法是生成一个证书,用户需要手动把证书安装到客户端中,然后终端发起的所有请求通过该证书完成与抓包工具的交互,饭后抓包工具再转发请求到服务器,最后把服务器返回的结果在控制台输出后返回给终端,从而完成整个请求的闭环。
-
既然HTTPS不能防止抓包,那HTTPS的意义是什么? HTTPS 可以防止用户在不知情下通信链路被监听,对于主动授信的抓包操作是不提供防护的,因为这个场景用户是已经对风险知情。要防止被抓包,需要采用应用级的安全防护,例如采用私有的对称加密,同时做好移动端的防反编译加固,防止本地算法被破解。
-
如何防止抓包?
对于HTTPS API接口,如何防止抓包呢?既然问题出在证书信任问题上,那么解决方法就是在我们的APP中预置证书。在TLS/SSL握手时,用预置在本地的证书中的公钥校验服务器的数字签名,只有签名通过才能成功握手。由于数字签名是使用私钥生成的,而私钥只掌握在我们手上,中间人无法伪造一个有效的签名,因此攻击失败,无法抓包。
同时,为了防止预置证书被替换,在证书存储上,可以将证书进行加密后进行「嵌入存储」,如嵌入在图片中或一段语音中。这涉及到信息隐写的领域,这个话题我们有空了详细说。
关于 Android 中Https 请求如何防止中间人攻击和Charles抓包,可以看一下这一篇文章。