本文意义
- 了解加密算法MD5的基本使用
- 了解HTTPS,如何接受安全证书
提交用户的隐私数据
-
首先一定要使用
POST
请求,向服务器提交用户的隐私数据- GET请求的所有参数都直接暴露在URL中
- 请求的URL一般会记录在服务器的访问日志中
- 服务器的访问日志是黑客攻击的重点对象之一
-
但仅仅用POST请求提交用户的隐私数据,还是不能完全解决安全问题
- 可以利用软件(比如Charles)设置代理服务器,拦截查看手机的请求数据
所以:
提交用户的隐私数据时,一定不要明文提交,要加密处理后再提交
一般会使用加密算法和HTTPS对隐私数据进行加密,再提交到服务器
加密算法
常见的加密算法
-
MD5
\ SHA \ DES \ 3DES \ RC2和RC4 \ RSA \ IDEA \ DSA \ AES
加密算法的选择
- 一般公司都会有一套自己的加密方案,按照公司接口文档的规定去加密
MD5
什么是MD5
- 全称是Message Digest Algorithm 5,译为“消息摘要算法第5版”
- 效果:对输入信息生成唯一的128位散列值(32个字符)
MD5的特点
- 输入两个不同的明文不会得到相同的输出值
- 根据输出值,不能得到原始的明文,即其过程不可逆,但现在有大型的数据库将明文对应的暗纹保存了,通过查询可以得到明文,算法本身是不可逆的
MD5的应用
- 由于MD5加密算法具有较好的安全性,而且免费,因此该加密算法被广泛使用
- 主要运用在数字签名、文件完整性验证以及口令加密等方面
MD5改进
- 现在的MD5已不再是绝对安全,对此,可以对MD5稍作改进,以增加解密的难度
- 加盐(Salt):在明文的固定位置插入随机串,然后再进行MD5
- 先加密,后乱序:先对明文进行MD5,然后对加密得到的MD5串的字符进行乱序
- 总之宗旨就是:黑客就算攻破了数据库,也无法解密出正确的明文
MD5的使用步骤
- 添加两个文件
- NSString+hash.h
- NSString+hash.m
- 导入头文件
- 调用字符串的
md5String
方法
NSString *text = @"www.baidu.com";
NSString *md = [text md5String];
HTTPS
HTTPS = HTTP + ssl(secure socket layer,安全套接字层)
基本原理:客户端向服务器发送请求,服务器并不是马上响应数据给客户端,而是先将安全证书(受保护控件)传给客户端,只有客户端同意了这个安全证书,服务器才会响应数据给客户端;只要客户端接受了该证书,客户端发送的请求数据都会受公钥保护,只有在服务器拿到私钥才能解密,这样保证数据的安全。
一些大型的网站默认让客户端同意证书
AFNetworking和SDWebImage框架内部已封装了同意证书代码
是否同意安全证书实现步骤
- 遵守协议
NSURLSessionTaskDelegate
,实现以下方法 - 实现代码
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler
{
// 证书有好几种
// 如果不是服务器信任类型的证书,直接返回
if (![challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) return;
// 如果block不为空,才执行相应代码,如果为空,会报错,所以要加上判断
if (completionHandler) {
// 通过调用这个block,来告诉URLSession要不要接收这个证书
// NSURLSessionAuthChallengeDisposition : 如何处理这个安全证书
// NSURLCredential :安全证书
completionHandler(NSURLSessionAuthChallengeUseCredential, challenge.proposedCredential);
}
}
- 上例程序中,也可以根据服务器的信任信息创建证书对象
NSURLCredential *crdential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
- 调用block代码的装逼版,注意冒号:后面不能为空
!completionHandler ? : completionHandler(NSURLSessionAuthChallengeUseCredential, challenge.proposedCredential);