网络编程归纳总结四阶段
请求
在HTTP/1.1协议中,定义了8种发送http请求的方法
GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT、PATCH
最常用的是GET和POST
网页中演示GET和POST
GET和POST对比
GET
i. GET一般是获取服务器上的数据
ii. GET方式是通过url传递数据,效率高
iii. 请求的数据在URL上,不安全
1) login.php?username=zs&pwd=123456
2) 参数中如果有中文和空格应该进行url编码
iv. GET请求的结果能够被浏览器缓存
POST
i. POST一般是往服务器提交数据,并获取服务器返回的结果
ii. POST方式是通过请求体传输数据,效率低
iii. 请求的数据用户看不到,相对安全
iv. POST请求不能被浏览器缓存
url中的参数
a. login.php负责处理登陆过程的服务端脚本
b. ? 后面跟要传到服务器上的参数(http协议的一部分)
c. 参数以 键=值 的形式传递
d. 如果有多个参数使用&连接
http://127.0.0.1/php/login.php?username=admin&password=123
Get请求模拟登陆
NSString *name = @"zhangsan";
NSString *pwd = @"zhang";
//请求的地址
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://127.0.0.1/php/login.php"]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//设置post
request.HTTPMethod = @"post";
//设置请求体
NSString *bodyString = [NSString stringWithFormat:@"username=%@&password=%@",name,pwd];
request.HTTPBody = [bodyString dataUsingEncoding:NSUTF8StringEncoding];
//发送异步请求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
//省略错误处理
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
NSLog(@"%@",dic);
}];
Post请求模拟登陆
NSString *name = @"zhangsan";
NSString *pwd = @"zhang";
//请求的地址
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://127.0.0.1/php/login.php"]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//设置post
request.HTTPMethod = @"post";
//设置请求体
NSString *bodyString = [NSString stringWithFormat:@"username=%@&password=%@",name,pwd];
request.HTTPBody = [bodyString dataUsingEncoding:NSUTF8StringEncoding];
//发送异步请求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
//省略错误处理
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
NSLog(@"%@",dic);
}];
编码
URL参数中如果有汉字、空格需要进行特殊处理否则,创建NSURL会返回nil
URL编码就是把汉字、空格,转换成%+16进制数的形式
//此方法只能把汉字和空格进行%转义 此方法在iOS9中过时
urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
//此方法可以设置哪些字符不进行%转义
urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
base64
base64对密码“加密”
base64编码—本质是编码不是加密
可以将任意的二进制数据编码成字符串,在网络上传输
在终端中演示
####base64编码
base64 xx.png -o abc.txt 编码文件
echo -n "Man" | base64 编码字符串
base64解码
base64 abc.txt -o xx.png -D 解码文件
echo -n "TWFu" | base64 -D 解码字符串
base64编码的原理
编码后的数据由 a-z A-Z 0-9 + / = 表示
把一个字符转换成二进制取出前6位查表
不够6位的时候补0,如果是8位,则补4个0 ,编码后连接两个==
如果最后是4位,补2个0,编码后连接一个=
编码之后文件会变大,是源文件的4/3 —12/8 6/4 — 3/2
1. 登录成功后”加密”密码,并保存到沙盒
2. 加载的时候从沙盒中读取密码,并”解密”
3. 登录,发送网络请求的时候”加密”密码,服务器验证的时候验证”加密”后的密码
4. 网络应用程序的数据安全
a. 网络上不允许传输用户隐私数据的“明文”
b. 在本地不允许保存用户隐私数据的“明文”
base64编码解码的方法:
//base64的编码 -- iOS7以后 系统提供了编码和解码的方法,不再需要第三方框架
- (NSString *)base64EncodeStr:(NSString *)str{
//把字符串转换成二进制
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
//base64编码
return [data base64EncodedStringWithOptions:0];
}
//base64解码
- (NSString *)base64DecodeStr:(NSString *)str{
//base64解码字符串,返回二进制数据
NSData *data = [[NSData alloc] initWithBase64EncodedString:str options:0];
//二进制数据转换为字符串
return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
加密
对称算法
加密解密都使用相同的秘钥
速度快,适合对大数据加密
DES,3DES,AES
非对称算法
算法公开,可逆的加密算法
用公钥加密,用私钥解密
用私钥加密,用公钥解密
速度慢,适合对小数据加密
RSA
普遍的加密
秘钥的安全要求很高的话,可以先用RSA加密AES的秘钥
散列算法
不可逆加密:MD5、SHA1、SHA256、SHA512
MD5算法
对任意的数据源 计算,生成固定长度的字符串。32个字符
一般用来加密密码
计算文件的md5值,用户可以验证从网络上下载的文件是否在下载的过程中被修改了
终端测试md5
md5 -s “admin”
结果: 21232f297a57a5a743894a0e4a801fc3
模拟用户登录中改用md5加密
破解md5,暴力破解(md5是不可逆的)
百度–在线破解md5
防止被暴力破解
加盐
原密码+一个复杂的字符串,防止用户输入的密码过于简单
HMAC
原密码+一个字符串 进行混合再 md5计算 把计算的结果+原密码 再进行md5计算
md5+时间,每次生成的md5值不一样
一个字符串key md5计算
把原密码和之前生成的md5值再进行hmac加密
从服务器获取当前时间 到分钟 的字符串
第二步产生的hmac值+时间 和第一步产生的md5值进行hmac加密
钥匙串
通过系统提供的钥匙串功能可以在本地保存密码,系统使用AES的方式对密码加密
查看Safari中保存的密码
使用第三方框架SSKeychain把密码保存到钥匙串和获取钥匙串中的密码
获取钥匙串中的所有用户
[SSKeychain allAccounts]
把密码保存到钥匙串中 service可以用bundleID
[SSKeychain setPassword:self.pwdView.text forService:kPWDCHAINKEY account:self.nameView.text];
从钥匙串中获取密码
self.pwdView.text = [SSKeychain passwordForService:kPWDCHAINKEY account:self.nameView.text];
最近才开始往github上放东西 在公司写的又不能放= = 大家姑且看看吧
github地址: https://github.com/FuThD