网络安全问题
归根结底为两个网络安全问题
本地存储的用户名和密码等
敏感
信息—可以通过查看用户的偏好设置进行破解- 可以通过 软件
iFunBox
查看指定应用的偏好设置.也就是说,一旦别人接触你的手机,并破解锁屏密码,那么手机中任何账户密码都会暴露.
- 可以通过 软件
网络传输过程中,黑客通过某些技术手段可以拦截用户发送的
敏感
信息可以通过软件
青花瓷
来抓取应用发送接收请求时的数据,并有针对性的进行破解,从而获取敏感信息.即使是用 POST 方法也能查看明文信息为了能让
青花瓷
抓取到手机访问电脑上网页资源的请求信息,需要先用本机分享无线网络给手机,然后在手机上设置该 wifi 热点的代理
为电脑的 ip 地址
Base64
- 既可以用来保存到本地,也可以用于网络传输加密.
- 经过 base64机密后的字符串就不像之前的明文那样好理解,在一定程度上可保护个人隐私
- 缺点 : 能编码,也能轻易解码
终端实现
- 编码
- echo -n “Amos” | base64
- 结果:QW1vcw==
- 解码
- echo -n “QW1vcw==” | base64 -D
- 结果:Amos
代码实现
编码
- 先将字符串转换成 NSData
在用 data 对象的base64NSStringWithOption方法获取加密后的字符串
- 代码如下
- (NSString*)base64Encoder:(NSString*)originalString { //1.先转化成二进制数据 NSData* data = [originalString dataUsingEncoding:NSUTF8StringEncoding]; //2.利用 data 加密 return [data base64EncodedStringWithOptions:0]; }
解码
先用NSData 的initWithBase64EncodedString创建一个对象data,此时data 已经是解码后的
2.利用 data 创建一个 NSString 对象,就是解码后的明文- 代码如下
- (NSString*)base64Decoder:(NSString*)encodedString { //1.根据加密的字符串创建二进制数据 NSData* data = [[NSData alloc] initWithBase64EncodedString:encodedString options:0]; return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; }
MD5(主要用于密码)
散列(哈希)函数
- 算法是公开的,对 所有语言都是通用的
- 对任意一个二进制数据进行加密,都能得到相同长度(32位)的密文
- 主要用于在网络传输中,用于密码加密
- 网盘应用 因为相同文件的 MD5都一样,所以文件在网盘上只需要存放一份
- 缺点:长度不够,国外已弃用,国内仍普遍使用
终端实现:
md5 -s “amos”
打印结果:MD5 (“amos”) = 2869191f3991a5611e8991dd59f9987d
代码实现:
都需要导入一个工具包头文件: NSString+Hash.h,下载地址:哈希函数
初步:
NSString* originalString = @"amos"; NSLog(@"加密后:%@", [originalString md5String]);
- md5String 这个是从NSString+Hash.h定义的分类方法,可返回字符串32位的 md5密文
加盐:
在原有字符串后添加其他字符串(多为特殊字符串),增加穷举难度
- (void)test { NSString* originalString = @"amos"; [self hashTestWithString:originalString]; } - (NSString*)hashTestWithString:(NSString*)originalString { //盐(干扰性字符串)---越咸越好 NSString* salt = @"%@#^&"; //加盐 originalString = [originalString stringByAppendingString:salt]; NSLog(@"加密后:%@", [originalString md5String]); return [originalString md5String]; }
- 结果:
加密后:2869191f3991a5611e8991dd59f9987d
多次 MD5
NSLog(@"加密后:%@", [[originalString md5String] md5String]);
- 结果:
加密后:350e1165ed352f68a24744584140039f
有序的乱序 MD5
//加密源字符串,得到密文 originalString = [originalString md5String]; NSLog(@"乱序前:%@", originalString); 1 //获取密文头部子字符串作为新密文尾部 NSString* trail = [originalString substringToIndex:2]; //获取密文尾部子字符串作为新密文头部 NSString* header = [originalString substringFromIndex:2]; NSLog(@"乱序后:%@", [header stringByAppendingString:trail]); //返回重新拼接的密文 return [header stringByAppendingString:trail];
- 结果:
乱序前:2869191f3991a5611e8991dd59f9987d 乱序后:69191f3991a5611e8991dd59f9987d28
注意:
不管是用哪一种规则,都要保持客户端与服务器端相同,否则将无法匹配,因为 MD5加密是不可逆的.
钥匙串(苹果推荐,在 iOS7.0.3之后才能使用)
- 主要用于保存到本地,将敏感信息交给钥匙串保管更安全
- 使用钥匙串访问,使用的是 AES 256算法,能够保证密码安全
- 钥匙串保存位置:未知,只有苹果知道
- 钥匙串访问 SDK 在 iOS7.0.3之后才发布
其接口是纯 C 语言的,有人封装成 OC, 使用很方便,名字是: SSKeyChain, 可以在 gitHub 上下载
事例代码:
- (void)testKeyChain
{
//1.保存账户和密码到钥匙串
NSBundle* bundle = [NSBundle mainBundle];
NSString* appId = bundle.bundleIdentifier;
[SSKeychain setPassword:@"amos" forService:appId account:@"username"];
[SSKeychain setPassword:@"heheda" forService:appId account:@"password"];
//2.从钥匙串中取出对应的账户和密码
NSString* username = [SSKeychain passwordForService:appId account:@"username"];
NSString* password = [SSKeychain passwordForService:appId account:@"password"];
NSLog(@"从钥匙串中获取的账户名:%@", username);
NSLog(@"从钥匙串中获取的密码:%@", password);
}
打印结果:
从钥匙串中获取的账户名:amos 从钥匙串中获取的密码:heheda