HTTP,HTTPS结构图

HTTPS作用:
1.数字证书防止假冒服务器。
2.混合加密:非对称加密防止对称秘钥泄露,对称加密防止内容被篡改。
CA证书签名原理:
1.服务器有一对公钥和私钥
2.服务器把公钥给了CA认证机构,CA机构用CA密钥对 “CA的一些资料和服务器公钥”进行加密形成CA证书
3.CA机构把CA证书返给服务器,服务器再发送给客户端
4.客户端内置CA公钥,通过CA公钥验证数字证书的合法性,从CA证书中获取服务器的公钥。

苹果签名的原理:
1.苹果有三端 苹果服务器 苹果手机 苹果电脑
2.苹果电脑 请求证书颁布机构拿到csr文件 里面包含 公钥M和私钥M
3.苹果服务器有私钥s
4.苹果手机有公钥s
5.两对公钥密钥所以一看就会知道这是双重非对称加密

SSL/TLS 协议基本流程:
客户端向服务器索要并验证服务器的公钥。
双方协商生产「会话秘钥」。
双方采用「会话秘钥」进行加密通信。
详细流程:
1.TCP 三次握手
2.TLS 三次握手:
1):client hello: 客户端发送SSL版本、随机数C、支持的加密算法等信息给服务端
2):server hello - server certificate - server hello - done: 服务端发送SSL版本、随机数、(根据客户端的支持的加密算法,选择出最高安全性的)加密方式、公钥、CA证书等信息给客户端
3):finished
3.客户端验证服务端证书(serverTrust)是否合法
1):使用本地CA公钥解密服务端发过来的CA证书 ,来获取到服务器的公钥,
2:)验证这个公钥与服务器直接发过来的公钥相比,看是否合法
4.客户端生成 Pre-master(预主秘钥),用公钥加密后发给服务端
5.服务端用私钥解密,拿到预主秘钥,这样双方都有 random c + random s + Pre-master, 根据协定的算法生成对称秘钥。之后双方就可以使用对称秘钥加解密。
6.由于非对称加密安全性高、性能差。所以使用非对称获取到预主秘钥后,后续都是对称加密。


网络参考模型:

TCP & UDP
UDP(用户数据报协议
1.只管发送,不确认对方是否接收到。
2.将数据源和目的封装成数据包中,不需要建立连接。
3.每个数据报的大小限制在64K之内。
4.因为无需连接,因此是不可靠协议。
5.不需要建立连接,速度快。
6.应用场景:多媒体教室/网络流媒体。
TCP(传输控制协议)
1.形成传输数据的通道。
2.在连接中进行大数据传输(数据大小不受限制)。
3.通过三次握手完成连接,是可靠协议,安全送达。
4.必须建立连接,效率会稍低。
TCP如何保证可靠性:
ACK机制:
- 每个数据包都有seq。
2.接收方收到发送方的数据包后,先验证数据的有效性(防止数据错误),再发送 3.seq + 1的ACK 回执。
4.如果一定时间内没有收到,则继续向发送方要这个seq + 1的数据(防止数据丢失/延迟)。
5.如果收到重复的包直接丢弃。

ACK延迟机制:
如果每个数据包都响应ACK,数量量会很大。所以有了ACK延迟,一定时间内如果收到了多个数据包,只按照最后一个正确的数据,发送ACK。

长/短连接 & 心跳包
短连接
1.数据请求结束后,立即断开连接。
2.能够及时释放服务器资源。
3.让服务器能够为更多的用户提供服务。
长连接
1.一旦连接建立之后,始终保持连接状态。
2.后续只需发送和接收数据即可,数据响应更及时。
3.长连接对服务器资源占用比较大。
4.对交互响应要求快的应用,例如即时通讯,需要使用长连接。
心跳包
1.是检测长连接的重要技术手段。
2.可以由服务器发送。
定时向客户端发送小数据,根据回执判断客户端是否在线。
3.也可以由客户端发送。
定时向服务器发送小数据,报告客户端当前在线。
socket, 基于TCP的长链接

序列化 & 反序列化
1.反序列化:在从服务器接收到数据之后,将二进制数据转换成 NSArray / NSDictionary。
2.序列化:在向服务器发送数据之前,将 NSArray / NSDictionary 转换成二进制的过程。
NSJSONSerialization 类
专门负责在 JSON 和 Foundation 对象直接转换的类
可以转换成 JSON 的 Foundation 对象需要具备以下条件:
顶级节点是 NSArray 或者 NSDictionary
所有的对象是 NSString, NSNumber, NSArray, NSDictionary 或者 NSNull
所有字典的 key 是 NSString
NSNumber 不是空或者无穷大
NSJSONSerialization
在实际开发中,获得网络的数组或者字典之后,通常会做字典转模型!反序列化的结果是否可变并不重要
选项选择 0,表示任何附加操作都不做,效率最高!
加密算法
1.base64
是网络上使用最广泛的编码系统,能够将任何二进制数据,转换成只有 65 个字符组成的文本文件
az,AZ,0~9,+,/,=
Base 64 编码后的结果能够反算,不够安全
Base 64 是所有现代加密算法的基础算法
OC:
/// BASE 64 编码
- (NSString *)base64Encode:(NSString *)string {
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
return [data base64EncodedStringWithOptions:0];
}
/// BASE 64 解码
- (NSString *)base64Decode:(NSString *)string {
NSData *data = [[NSData alloc] initWithBase64EncodedString:string options:0];
return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
OC:
# 将字符串 Man 进行 base64 编码
$ echo -n "Man" | base64
# 将字符串 TWFu 解码
$ echo -n "TWFu" | base64 -D
2.md5
OC:
# 得到文件的MD5值
$ md5 文件名
# 得到字符串的MD5值
md5 -s "string"
MD5的加密方案:
md5 + 盐
md5 多次
md5 + 有规律的乱序
/**
* 先加密, 后乱序
*/
- (NSString *)digest4:(NSString *)str
{
NSString *anwen = [str md5String];
// 注册: 123 ---- 2CB962AC59075B964B07152D234B7020
// 登录: 123 --- 202CB962AC59075B964B07152D234B70
NSString *header = [anwen substringToIndex:2];
NSString *footer = [anwen substringFromIndex:2];
anwen = [footer stringByAppendingString:header];
NSLog(@"%@ - %@", str, anwen);
return anwen;
}
3.钥匙串
-
苹果的"生态圈",钥匙串访问,使用 AES 256 加密算法,能够保证用户密码的安全
-
将数据存在手机上,即使卸载了app. 再重新装回来也能获取。同公司不同app 之间也能获取数据。
-
C语言的框架, 使用起来有点不太方便。不过有对应的OC开源三方框架
三方框架的使用:
/// 所有账户
+ (NSArray *)allAccounts;
/// 获取所有账户信息
+ (NSArray *)accountsForService:(NSString *)serviceName;
/// 获取账号密码
+ (NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account;
/// 删除账号密码
+ (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account;
/// 将账号密码保存在钥匙串
+ (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account;
青山不改,绿水长流,后会有期,感谢每一位佳人的支持!
网友评论