编码、加密、Hash、TCP/IP、HTTPS

密码学

7753368-676b6210032cadaf.png
移位式加密

现代密码学

对称加密

原理:使⽤用密钥和加密算法对数据进行转换,得到的无意义数据即为密⽂;使用密钥和解密算法对密⽂进行逆向转换,得到原数据。
7753368-25fbc293c3f87d09.png
对称加密

算法:DES、AES

非对称加密

原理:使⽤公钥对数据进行加密得到密文;使⽤用私钥对数据进⾏解密得到原数据。
7753368-3b39eddc54ceba92.png
非对称加密
公钥和私钥
7753368-74abb330c044bbfe.png
非对称加密

对上图的解释:首先,将AB的加密密钥互相传输给彼此,在A处,使用加密密钥B给数据加密,得到密文,将密文传输给B,在B处,使用解密密钥将密文解密。B给A传输数据的过程相似。此时,即使加密密钥和密文同时被C截获,也无法将密文解密。

事实上:加密密钥就是公钥,解密密钥就是私钥。
需要注意的是:加密和解密必须使用的是同一对,比如A给B传输密文,A必须拿的是B的公钥进行数据的加密。

延伸用途:数字签名。

公钥和私钥是可以互相解的。如果用私钥通过加密算法进行加密,公钥同样可以解密,取得原数据。
签名与验证
7753368-33e9336dc268a994.png
签名与验证

对上图的解释:将原数据通过我的私钥,也就是签名,进行加密,得到签名数据,别人拿我的公钥对我的签名数据进行解密(也就是验证的过程),得到的就是我要发送的原数据。签名数据只有我能造出来,因为只有我拥有我的私钥,这就证明了这个数据是我写出来的。也就是所谓的签名的作用。

签名和验证与别的加密不同的点在于,签名和验证是拿私钥加密(签名),公钥解密(验证)。

7753368-65b776ddb6b0389a.png
加密+签名

根据加密+签名,可以得到签了名的密文。这样就可以得到确认发送方的密文。比如A给B发送密文,如果中间有一个C同样拥有B的公钥,此时如果没有签名,C同样可以给B发送密文,冒充是A发送的。有了签名,也就是A的私钥,C就无法冒充自己是A。

经典算法:RSA、DSA

密码学密钥和登录密码

密钥(Key)

用于加密和解密,保证数据被盗时不会被人读懂内容

登录密码(password)

进入网站或游戏前的身份验证。数据提供⽅方、或应⽤用服务⽅对账户拥有者数据的保护,保证「你是你」的时候才提供权限。

Base64

将二进制数据转换成由64个字符组成的字符串的编码算法。

7753368-a224d00305cfc621.png
Base64码表
7753368-ae1a13ca896eb88b.png
Base64编码示例

Base64是将普通字符的二进制编码,每6位已转化,如M通过Base64的转化,变成了19,在码表中可以找到19对应的Base64编码为T。依此类推,Man转化成Base64编码就是TWFu,可见,通过Base64转化的文本变大了。实际上,数据每次通过Base64编码后,数据会增大1/3,会影响运输和传输的性能。

Base64的作用:让原数据具有字符串所具有的特性,可以放在URL中传输,可以保存到文本文件,可以通过普通的聊天软件进行文本传输。

7753368-de487b5a86a858a9.png
Base64的末尾补足

Base64加密图片会更加安全和高效吗?不会,Base64是公开的算法,加密和解密都是公开的,任何人都可以解密,因此并不会更安全。通过Base64加密的文件或数据,都会增大约1/3,降低网络性能,增大用户流量,因此也不存在更高效的问题。

1.Base58

比特币使⽤的编码⽅方式,去掉了 Base64 中的数字 "0",字⺟大写 "O",字⺟大写 "I",和字⺟小写 "l",以及 "+" 和 "/" 符号,⽤于比特币地址的表示。Base58 对于 Base64 的改动,主要目的在于用户的便捷性。由于去掉了难以区分的字符,使得 Base58 对于「人工抄写」更加方便。另外,去掉了 "+" "/" 号后也让⼤多数的软件可以⽅便双击选取。

2.URL encoding

在 URL 的字符串中,对一些不用于特殊用途的保留字符,使⽤百分号 "%" 为前缀进行单单独编码,以避免出现解析错误。
比如:“https://www.jianshu.com/p/简书”
这样一个链接,通过URL encoding后就会转化成“https://www.jianshu.com/p/%E7%AE%80%E4%B9%A6
如:“http://hencoder.com/user/?name=隐匿&伟⼤”通过转化后的链接就变成了“http://hencoder.com/user/?name=隐匿%26伟大”。这种类型的编码只用于URL。

压缩与解压缩

压缩:把数据换一种方式来存储,以减少存储空间。
解压缩:把压缩后的数据还原成原先的形式,以便使用。

常⻅见压缩算法:DEFLATE(zip)、JPEG、MP3

压缩属于编码吗?
属于,编码就是将数据从一种格式转化成另一种格式。压缩属于编码过程,解压缩属于解码过程。

媒体数据的编解码。

图片的编码:把图像数据写成 JPG、PNG 等⽂件的编码格式。
图⽚的解码:把 JPG、PNG 等⽂文件中的数据解析成标准的图像数据。

序列化

把数据对象,一般是内存中的,如JVM中的对象,转换成字节序列的过程。

反序列化

把字节序列重新转换成内存中的对象。

Hash

把任意数据转换成指定大小范围(通常很小)的数据。

经典算法:MD5、SHA1、SHA256等。

实际用途:
1、数据完整性验证
从⽹络上下载文件后,通过比对文件的 Hash 值(例如 MD5、SHA1),可以确认下载的文件是否有损坏。如果下载的文件 Hash 值和文件提供方给出的 Hash 值一致,则证明下载的文件是完好无损的。

2、唯一性验证:例如 Java 中的 hashCode() 方法。hashCode是一个数据的指纹信息,也就是从这个数据身上采取了足够多的特征来证明“你是你”。

public class Person{
   int age;
   String name;

//假设 hashCode可以用这种方式表示 
public long hashCode(){
    return age + name.length();
}

}

Person的hashCode就可以是age + name.length()。以上HashCode()的写法肯定是错误的,但是却能很好的解释HashCode()。

3、快速查找:hashCode和HashMap
hashCode是数据的内存地址。
HashMap:Key的HashCode是Value的地址,通过Key的HashCode可以找到Value。

在重写equals()时,也必须重写hashCode(),因为如果不重写hashCode(),当使用equals()比较时,hashCode()是Object中的hashCode(),很可能出现用equals()判断相等而用hashCode()判断不相等的情况。也有可能是相反的,equals判断不相等,而hashCode却相等,那么就会出现明明两者不相等,在存入HashMap中时,两个不同的Key指向了同一个对象,这样会造成程序的Bug。

4、隐私保护
当重要数据必须暴露的时候,有事可以选择暴露它的 Hash 值(例例如 MD5),以保障原数据的安全。 例如⽹站登录时,可以只保存⽤户密码的 Hash 值,在每次登录验证时只需要将输入的密码的 Hash 值和数据库中保存的 Hash 值作⽐对就好,网站无需知道用户的密码。这样,当网站数据失窃时,⽤户不会因为自⼰的密码被盗导致其他网站的安全也受到威胁。

Hash 是编码吗?
不是。 Hash 是单向过程,往往是不可逆的,无法进行逆向恢复操作,因此 Hash 不属于编码。
Hash 是加密吗?
不是。Hash 是单向过程,无法进行逆向回复操作,因此 Hash 不属于加密。(记住,MD5 不是加密!MD5不可逆。)

7753368-a851da7ec0ebcfc5.png
完整的非对称加密的过程

对数据进行签名时,实际上,是对数据的hash值(摘要)进行签名(加密),解密时,是对原数据进行hash,得到摘要,再将加密过的摘要进行解密,将得到的两者对比,如果一致就验证通过。

登录和授权

登录:身份认证,确认你是你的过程。
授权:由身份或持有的令牌确认享有某些权限(例如获取用户信息)。登录过程实质上的目的也是为了确认权限。

1. cookie

工作机制:

  1. 服务器需要客户端保存的内容,放在Set-Cookie的headers里返回,客户端会自动保存。

  2. 客户端保存的Cookies,会在之后的所有请求里都携带进Cookie header里发回给服务器。

3.客户端保存Cookie是按照服务器域名来分类的,例如shop.com发回的Cookie保存下来以后,在之后向games.com的请求中并不会被携带。

4.客户端保存的Cookie在超时后会被删除,没有设置超时时间的Cookie(称作Session Cookie)在浏览器关闭后就会自动删除,另外,服务器也可以主动删除还未过期的客户端Cookies。

  1. Cookie是由服务端管理的,客户端只是被动接受。
使用Cookie管理登录状态。
7753368-0fcf5f2bebb98469.png
image.png
7753368-79198440c9550fb4.png
Cookie管理登录状态
2.Authorization
1.Basic

格式:Authorization: Basic <username:password(Base64ed)>
把字符串username:password进行Base64转码
有风险,如果被截取,就能知道用户名密码

2.Bearer

格式:Authorization: Bearer <bearer token>
bearer token获取,通过OAuth2授权流程获取。

OAuth2授权流程
  1. 第三⽅网站向授权方网站申请第三方授权合作,拿到 client id 和 client secret

  2. ⽤户在使用第三方网站时,点击「通过 XX (如 GitHub) 授权」按钮,第三方网站将页面跳转到授权方网站,并传入client id 作为⾃自⼰己的身份标识

  3. 授权方网站根据 client id ,将第三⽅网站的信息和第三⽅网站需要的用户权限展示给⽤户,并询问用户是否同意授权

  4. 用户点击「同意授权」按钮后,授权方网站将页面跳转回第三⽅网站,并传入Authorization code 作为用户认可的凭证。

  5. 第三方网站将 Authorization code 发送回自己的服务器

  6. 服务器将 Authorization code 和自己的 client secret ⼀并发送给授权方的服务器,授权方服务器在验证通过后,返回 access token。OAuth 流程结束。

  7. 在上⾯的过程结束之后,第三⽅网站的服务器(或者有时客户端也会)就可以使用 access
    token 作为用户授权的令牌,向授权方网站发送请求来获取⽤户信息或操作用户账户。但这已经在 OAuth 流程之外。

第三方App通过微信登录的过程。
  1. 第三方 App 向腾讯申请第三⽅授权合作,拿到 client id 和 client secret
  2. 用户在使用第三方 App 时,点击「通过微信登录」,第三⽅App 将使⽤微信 SDK 跳转到
    微信,并传入自己的 client id 作为自⼰的身份标识
  3. 微信通过和服务器交互,拿到第三⽅App 的信息,并限制在界⾯中,然后询问用户是否同意授权该 App 使用微信来登录
  4. 用户点击「使用微信登录」后,微信和服务器交互将授权信息提交,然后跳转回第三⽅
    App,并传⼊Authorization code 作为用户认可的凭证
  5. 第三方 App 调用自己服务器的「微信登录」Api,并传入 Authorization code,然后等待
    服务器的响应
  6. 服务器在收到登录请求后,拿收到的 Authorization code 去向微信的第三方授权接口发送请求,将 Authorization code 和⾃己的 client secret 一起作为参数发送,微信在验证通过
    后,返回 access token
  7. 服务器在收到 access token 后,⽴即拿着 access token 去向微信的用户信息接口发送请求,微信验证通过后,返回⽤用户信息
  8. 服务器在收到用户信息后,在自⼰的数据库中为用户创建⼀个账户,并使用从微信服务器拿来的用户信息填入自己的数据库,以及将用户的 ID 和用户的微信 ID 做关联
  9. 用户创建完成后,服务器向客户端的请求发送响应,传送回刚创建好的⽤户信息
  10. 客户端收到服务器响应,⽤用户登录成功

TCP/IP协议族

一系列协议所组成的一个网络分层模型。
分层是因为网络的不稳定性。

7753368-1dc5f660fa1f6c67.png
TCP/IP分层

TCP/IP工作过程:1.HTTP要传输数据,告诉TCP,要传数据了。2.TCP将数据分段,并且告诉IP,IP是实际传输数据的层,但IP只管传,不管有没有传到,每传到一个,IP就告诉TCP,数据接收到了,接收方的TCP就传一个接收到的信息回去给发送方的TCP,如果TCP没有接收到接收方TCP接收到数据的消息,就会让IP层再传一遍。

TCP负责将数据分段,编号,检测是否传输成功。
  1. 最下面一层是数据链路层,给我们的传输提供现实网络的支持。物理层。

具体分层:
Application Layer 应用层:HTTP、FTP、DNS Transport Layer 传输层:TCP、UDP
Internet Layer ⽹络层:IP
Link Layer 数据链路层:以太⽹网、Wi-Fi

TCP连接

1.什么是连接?
通信双方建立确认「可以通信」,不会将对方的消息丢弃,即为「建立连接」

2.TCP连接的建立
三次握手:


7753368-2fea9f729f214f13.png
三次握手

3.TCP连接的关闭


7753368-d637e48ebc2af4e4.png
TCP连接的关闭

4.长连接
强制不让连接的通道关闭。
为什么需要长连接?
因为移动网络并不在 Internet 中,⽽是在运营商的内网,并不具有真正的公网 IP,因此当某个 TCP 连接在一段时间不通信之后,⽹关会出于网络性能考虑⽽关闭这条 TCP 连接和公⽹的连接通道,导致 这个 TCP 端⼝不再能收到外部通信消息,即 TCP 连接被动关闭。
怎样实现长连接?
⼼跳。即在一定间隔时间内,使⽤TCP连接发送超短无意义消息来让网关不能将⾃己定义为「空闲连接」,从而防止网关将⾃己的连接关闭。

HTTPS

HTTPS不是一种单独的协议,它是HTTP建立在SSL/TSL之上。

SSL:Secure Socket Layer
现在叫做TLS:Transport Layer Secure。在HTTP之下增加的一个安全层,用于保障HTTP的加密传输。这一层是在HTTP层的下面,在TCP层的上面。

HTTPS的本质:在客户端和服务器之间协商出一个对称密钥,每次发送信息之前将内容加密,收到之后解密,达到内容的加密传输。

HTTPS流程:
1.客户端请求建立TLS连接
2.服务器发回证书
3.客户端验证服务器证书
4.客户端信任服务器后,和服务器协商对称密钥
5.使用对称密钥开始通信

HTTPS传输过程:

  1. ClientHello 客户端发送给服务器,告诉服务器,我要建立连接。并且附加上自己的信息:可支持的TLS版本、Cipher Suite:加密套件,即客户端可以接受的对称加密的算法、非对称加密的算法、Hash算法、客户端的随机数(用来计算加密密钥)
  2. Server Hello,服务器跟客户端说:好的。
  3. 服务器附上自己的证书、服务器的随机数。服务器证书里面包含了服务器的公钥、服务器的地址等关键信息,以便于客户端验证服务器地址、服务器证书签名,用于验证服务器地址公钥等是否正确。那么如何去验证签名呢?服务器还会发回一个签名方的信息,也就是签名机构,其中包括了证书机构公钥、证书机构的其他信息。但是如何证明证书机构是合法的呢,证书机构中提供了证书机构的签发方。而证书机构的签发方,可以在电脑中操作系统中的根证书的列表。如下两图。


    7753368-42d37e8c60de7599.png
    服务器证书验证过程
7753368-a1050c16dd8c1274.png
系统根证书列表
7753368-d3480910d1ca3729.png
HTTPS流程一
  1. 客户端拿到服务器公钥后,会做唯一一次非对称加密的过程。它会拿着服务器公钥去加密Pre-master Secret(实际上是一个随机数)
  2. 拿到Pre-master Secret之后,客户端和服务端会将其与客户端随机数,服务端随机数通过算法计算出一个数:Mater Secret。
    (客户端随机数和服务端随机数的作用就是让密钥更加安全)
  3. 通过Master Secret计算密钥,这个密钥是4个东西:客户端加密密钥,服务端加密密钥,客户端Mac Secret、服务端Mac Secret
    Mac Secret实际上就是HMAC:
    Hash-based Message Authenticate Code 改良版的Hash,
7753368-d13efabb97043ef4.png
HTTPS连接流程二
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值