NO1.加密-授权-协议
零蚀
- 加密原理
- Base64
- 压缩和解压
- 序列化
- Hash
- 字符集
- 登陆授权
- TCP/IP协议族
- 长连接简介
- HTTPS
-
加密原理
- 密码学
古典密码学 :密码学起源于古典密码学,早起运用移位式加密,加密算法:缠绕后书写,密钥:⽊棒的尺⼨,后续发展到替换加密:每个字母对应码表上的字符,加密算法:替换⽂文字,密钥:替换的码表。
现代密码学 :适用任何二进制加密,对称加密和非对称加密是目前最为普遍的算法, 对称加密 类似于古典密码学的替换加密。 因为在通信领域网络是完全不可信的,因为数据的发送方式是像广播的发散性的,群体接收,所以可以盗取数据。对称加密分为DES,AES,DES由于密钥很短,所以弃用了,而AES密钥长,所以还在沿用。密钥短可能在暴力破解下,被解析出来,用过幻影破解wifi跑字典的人应该了解。非对称加密 用算法溢出来进行加解密的原理。 非对称加密关键在于加密密钥即使泄露也不会对信息有什么影响,加密密钥称为公钥,解密密钥为私钥。公钥和私钥是可以互相解的,公钥有时是可以被计算出来的(椭圆曲线算法),公钥有时可以被私钥算出来。私钥和公钥的重要部分是一致,非对称加密RSA用来加密签名,速度慢,DSA速度快,因为其中还专门设计生成签名功能。- 对称加密视图
- 非对称加密示图
- 签名验证
签名不是加密方式,一般在传输重要信息时,一方用公钥B加密,私钥A签名,另一方可以用私钥B 解密,公钥A验证。
登陆时候用到的密码,也是用来验证,没有其他意义。
-
Base64
- 将二进制数据(广义上非文本数据)转化为64个字符组成的字符串编码算法(az,AZ,0~9,+ /),对应的Base64的编码表。
- 作用,是将原数据具有字符串的特性,比如放在URL里面进行传输,可以保存文件,可以通过聊天软件进行文本传输。 将非字符串转成字符串。所以Base64不是用来加密的,也不是提高效率的Base64会增长远来数据的1/3长度。
- 变种:Base58 去除了0,大些O,L,I,+,/,方便辨识,方便双击复制。URL encoding
-
压缩和解压
- 常用的压缩方法有DEFLATE,JPEG,MP3。常见会用zip的打包,打包也被称为归档, 归档的同时进行压缩。JPEG对jpg图片进行压缩,MP3对音频文件进行压缩。
- 编码的解释是,数据格式转换中不会有数据的改变和缺失,所以压缩也属于编码。压缩算法的本质:比如将重复项归结为一个数字,3:100等,或者将二进制的长度变成高进制,来减短数据的长度。
-
序列化
- 原理:将数据转换为线型的,可以通用解析的格式。比如:序列化为json格式{‘name’:‘kk’…age:10},这个数据线性化后,可以被存储,可以被传输,可以和外界通信。
- 序列化不属于编码,他只是内存里存的一堆数据。
-
Hash
- 将数据转化为指定大小范围(通常小的范围)的数据,作用:作为摘要,数字指纹,例如有一个对象,有很多属性,但是我用1001,代替它,当我需要调用一个大数据时,我直接拿1001,所以hash是一种验证方式。
- hash要解决碰撞率(冲突率),所以Hash有很多算法,里面包括MD5,SHA1,SHA256,
- 实际用途:数据完整性验证,快速查找(java里的HashCode见下文)。 隐私保护,如果网站的数据库给盗了,明文存储直接会信息泄露,所以要用hash处理。
- 加盐,因为Hash不可逆,不能解密,但是可以通过记录映射关系的方法来破解签名,那个映射表称为彩虹表,所以就有了加盐,例 MD5(‘盐’+(‘盐’+数据)),Hash是单向的,所以不是编码,Hash,Md5,。
⚠️java里重写equals()方法时算法时候要重写hashcode()。 原因hashCode()是采取你数据的所有指纹信息,就像我们在java里为什么xx.equals(“xx”),则么证明两个数据是相等的,怎么证明你是你,就是通过hashCode获取最够的指纹信息,来进行判别。
⚠️MD5 不是加密,不是编码,不可逆。
-
登陆授权
-
Cookie
起源于购物车,现在的购物车存在于服务器,以前是打算存在本地,所以做了cookie- 示图,早期cookie原理
Set-cookie是服务器通知客户端可以讲cookie存下来,每次客户端访问服务器再把它带出去,现在cookie已经在登陆,验证领域逐渐被抛弃。
- 视图,早期登陆,使用cookie管理登陆状态
- Cookie的作用:
- 绘画管理 : 登陆状态,购物车🛒 etc.
- 个性化 : 用户偏好,主题 etc.
- tracking : 追踪用户行为,通过第三方网站的记录,记录用户的点击数据,方便对用户的行为习惯进行画像。
- Cookie攻击手段
- XSS:跨站脚本攻击,可能拿到cookie相关的重要信息,如登陆,然后发出。防御手段,在set-cookie:…HttpOnly ,后面添加这种信息,表示只是在http之间做交换,不能被提取。
- XSRF:跨站请求伪造,若最近有银行网站浏览信息,会直接拿到请求信息,直接将现金转走,不需要任何东西,cookie里面都有信息,抵御方案Referer,不同网站,不予响应。
-
Authorization
- Basic
基本格式:Authorization:Basic< username:password(Base64ed) >
请求样式:
get/user/1.1 host:xxx Authorization:Basic 认证信息
目前的使用的基本的都是https,https有加密系统,所以安全的多,唯一的问题时可能在本地破解,不然不会获取你的信息。
- Bearer
请求样式:获取token开进行验证。
get/user/1.1 host:xxx Authorization:Bearer <bearer token>
- OAuth2
第三方认证,授权时,授权方会确认第三方的身份信息,然后传递相关信息client_id,当这个授权之后,会返回授权码,由于之间可能被拦截(浏览器/中间环节是不可靠的)所以授权码只是证明,授权的结果是为获取token。授权码被第三方发送给服务器,服务器会发送一个信息给授权方,其中包含授权码和client_secret,client_secret是为了自己证明身份,证明了安全性,此时授权方 返回access token(Authorization Bearer:),授权结束。
视图:
- Refresh Token
在第5步,token会失效,或丢失,token都是有有效期,当token失效时需要,服务端会发送refresh然后服务端会将token失效掉,然后换取新的token,这个过程的唯一验证是服务器的client_secret。
post/user/1.1 refresh_token=xxxxx
- Basic
-
-
TCP/IP协议族
- TCP/IP的由来
网络协议为什么要分层:一层不可以吗,为什么不直接传只要网络层和应用层不就够了,因为网络的不稳定,部分网络出现断线,瘫痪,等等情况,必然会发生重传,大数据会被切块传输(减少总体失败的平均耗时和流量),所以把数据传输直接调个功能模块,用来专门负责传输,其他层用来提供数据,数据如过丢了,它会负责重新传递,它负责数据分块等功能,来保证数据的稳定传输, 这就是TCP。
除此之外,有些业务不需要重传,允许丢包,所以就有UDP。当UDP和TCP都有网络方面的功能,所以在UDP和TCP中又抽了一层,仅完成底层功能(比如单纯的传输),这就是IP层/网络层。
视图:
LINK是数据链路层,是以太网层,也可以把LINK里面的网线,路由器,当作物理层分出去
- TCP/IP的由来
-
长连接简介
客户端可能是在内网里面,如我们手机就是在运营商的内网里,内网和外网链接需要网关,运营商开端口(网关)需要耗损资源,所以当长时间没有使用网络,运营商就会关闭网络。此时外界发消息来,端口已经关闭,所以长时间的业务,必须保持长链接,做法欺骗网关方式,使用心跳,一直发送信息保持联通。
-
HTTPS
-
Http over SSL
Http建立在SSL基础之上,所以叫做https,https不是一个单纯的协议,在Http之下建立一个安全层(在应用层和网络层之间),用于保障Http 的加密传输。SSL :Secure Socket Layer(早期)->TLS Transport Layer Secure (现在 )。
Https加密用的是对称加密,密钥用的是非对称处理过,每次发送都会加密,收到后解密,为什么不直接用非对称,因为非对称的速度太慢了。 -
Https连接
- 客户端请求TLS连接(TCP通信)
- 服务器返回证书(TCP通信)
- 客户端验证证书(TCP通信)
- 客户端确认证书,去和服务器协商这个用非对称加密过的的对称密钥(TCP通信)
- 用对称密钥连接(Http通信)
-
流程细节
- 首先客户端会发送信息给服务器
请求建立连接,并且附加上一些需要的信息,比如我需要的TSL版本,加密套件Cipher Suite{对称加密,非对称加密,hash}(就是我能接受的加密方法),并且有客户端随机数。 ▶️当前客户端&服务器 持有{TSL,Cipher Suite{对称加密,非对称加密,hash},客户端随机数}
- 服务器返回信息
服务器返回信息,包括,TSL,Cipher suit, hash,同时服务器返回一个服务器的随机数&服务器随机数。▶️当前客户端&服务器 持有{TSL,Cipher Suite{对称加密,非对称加密,hash},客户端随机数,服务器随机数}
- 服务器发送证书给客户端
证书中包含了服务器的公钥,外层证书服务器地址,只是证明,这可能是来自服务器,所以提供了服务器签名,用来证明来路正确,中间层是为了证实这个信息是被这个公钥持有者所造,但不能说明,这个信息是谁出版的。所以由证书机构证明它的信息,为什么证书签发方可以证实我是我,那就是系统里的签发方根证书。▶️当前客户端&服务器 持有{TSL,Cipher Suite{对称加密,非对称加密,hash},客户端随机数,服务器随机数,服务器公钥 }
证书模式:
证书结构:
- 非对称加密准主要密文给服务器(Pre-master-secret随机数),Pre-master-secret是对当前的所有的信息加密。▶️当前客户端&服务器 持有{TSL,Cipher Suite{对称加密,非对称加密,hash},客户端随机数,服务器随机数,服务器公钥 ,Pre-master-secret–>B}
- 构造master-secret
运算(客户端随机数+服务器随机数+Pre-master-secret)的数据得到Master-Secret。
用master-secret计算密钥,可以得到以下:- 客户端加密密钥
- 服务端加密密钥
- 客户端MAC Secret
- 服务端MAC Secret
▶️当前客户端&服务器 持有{TSL,Cipher Suite{对称加密,非对称加密,hash},客户端随机数,服务器随机数,服务器公钥 ,Pre-master-secret–>B,{客户端加密密钥,服务端加密密钥,客户端MAC Secret,服务端MAC Secret}}
HMAC是改良版的hash,MAC Secret也是HMAC,用于验证,是否一致,从而来验证你是否是你。- 客户端发送Finish,验证签名通过,服务器发送信息。
- Https通信开始。发出一连串没人看的懂的信息。
- 首先客户端会发送信息给服务器
-
🔗 前言
🔗 Android 网络列表
🔗 网络篇 前言 从HTTP说起
🔗 NO2.Retrofit和Http
🔗 NO3.从OkHttp看Http
🔗 NO4.剖析RxJava2