DataSecurity(数据安全)
提交用户的隐私数据
- 一定要使用POST请求提交用户的隐私数据
- GET请求的所有参数都直接暴露在URL中
- 请求的URL一般会记录在服务器的访问日志中
服务器的访问日志是黑客攻击的重点对象之一
用户的隐私数据
- 登录密码
- 银行账号
数据安全
- 仅仅用POST请求提交用户的隐私数据,还是不能完全解决安全问题
- 可以利用软件(比如Charles)设置代理服务器,拦截查看手机的请求数据
因此:提交用户的隐私数据时,一定不要明文提交,要加密处理后再提交
常见的加密算法
- MD5 \ SHA \ DES \ 3DES \ RC2和RC4 \ RSA \ IDEA \ DSA \ AES
加密算法的选择
- 一般公司都会有一套自己的加密方案,按照公司接口文档的规定去加密
MD5
- 全称Message Digest Algorithm 5,译为“消息摘要算法第5版”
效果:对输入信息生成唯一的128位散列值(32个字符)
MD5的特点
- 输入两个不同的明文不会得到相同的输出值
- 根据输出值,不能得到原始的明文,即其过程不可逆
MD5的应用
- 由于MD5加密算法具有较好的安全性,而且免费,因此该加密算法被广泛使用
- 主要运用在数字签名、文件完整性验证以及口令加密等方面
MD5解密网站:http://www.cmd5.com 提交隐私数据的安全过程 – 注册
提交隐私数据的安全过程 – 登录
使用
NSString *text = @"520it";
NSString *md = [text md5String];
MD5改进
- 现在的MD5已不再是绝对安全,对此,可以对MD5稍作改进,以增加解密的难度
- 加盐(Salt):在明文的固定位置插入随机串,然后再进行MD5
- 先加密,后乱序:先对明文进行MD5,然后对加密得到的MD5串的字符进行乱序
- … …
- 总之宗旨就是:黑客就算攻破了数据库,也无法解密出正确的明文
Charles
- Charles是一款代理服务器软件,可以用来拦截网络请求
- 利用Charles能得知大部分公司app的数据来源和数据格式
- 下载地址:http://www.charlesproxy.com/download/
检测网络状态
- 在网络应用中,需要对用户设备的网络状态进行实时监控,目的是
- 让用户了解自己的网络状态,防止一些误会(比如怪应用无能)
- 根据用户的网络状态进行智能处理,节省用户流量,提高用户体验
- WIFI\3G网络:自动下载高清图片
- 低速网络:只下载缩略图
没有网络:只显示离线的缓存数据
苹果官方提供了一个叫Reachability的示例程序,便于开发者检测网络状态 https://developer.apple.com/library/ios/samplecode/Reachability/Reachability.zip
Reachability
- 常见用法
// 是否WIFI
+ (BOOL) IsEnableWIFI {
return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable);
}
// 是否3G
+ (BOOL) IsEnable3G {
return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable);
}
网络监控
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(reachabilityChanged:) name: kReachabilityChangedNotification object: nil];
self.netReachability = [Reachability reachabilityForInternetConnection];
[self.netReachability startNotifier];
- (void)dealloc
{
[self.netReachability stopNotifier];
[[NSNotificationCenter defaultCenter] removeObserver:self name:kReachabilityChangedNotification object:nil];
}
HTTPS
#pragma mark - <NSURLSessionTaskDelegate>
/**
* challenge : 挑战、质询
* completionHandler : 通过调用这个block,来告诉URLSession要不要接收这个证书
*/
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler
{
// 如果不是服务器信任类型的证书,直接返回
if (![challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) return;
// void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *)
// NSURLSessionAuthChallengeDisposition : 如何处理这个安全证书
// NSURLCredential :安全证书
// 根据服务器的信任信息创建证书对象
// NSURLCredential *crdential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
// 利用这个block说明使用这个证书
// if (completionHandler) {
// completionHandler(NSURLSessionAuthChallengeUseCredential, crdential);
// }
!completionHandler ? : completionHandler(NSURLSessionAuthChallengeUseCredential, challenge.proposedCredential);
}