网络开发准则
- 1.在网络开发中不允许传输用户明文隐私数据
- 2.在本地不允许保存用户的明文隐私数据
1.HTTPS认证
单向认证
- 非证书模式
//适配HTTPS-非证书模式
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
[securityPolicy setValidatesDomainName:NO];
securityPolicy.allowInvalidCertificates = YES; //还是必须设成YES
manager.securityPolicy = securityPolicy;
- 证书模式
材料:买来的服务器证书server.cer(客户端要用来验证服务端) - Client向Server请求证书
- 和自己的证书对比,不一致或者无效就断开连接
- 通过后用户随机产生一个秘钥通过Server的公钥加密传给服务端
- Server用自己的私钥解密,拿到对称秘钥key
- Server和Client指定这个秘钥为加密秘钥,通讯数据由秘钥加密
双向认证
双向认证比单向认证多了一步,就是服务器要认证客户端
材料:
- 买来的服务器证书server.cer(客户端要放一个,用来验证服务端)
- CA的根证书(放到服务器中,用来验证客户端的证书)
- p12证书(用来放到客户端,网络请求的时候会传给服务端)。
- 用户在产生随机密钥的时候
- 要用p12文件来对一段数据进行签名,然后把签名和p12证书,加密的对称密钥传给服务器,然后服务器接到以后,会用CA根证书(或自签的根证书)来对证书和签名数据进行验证,如果正确,通讯继续,否则,断开连接。
客户端适配
- 添加证书模式:AFSSLPinningModeCertificate mode
客户端认证服务端
NSString * cerPath = [[NSBundle mainBundle] pathForResource:@"证书名称" ofType:@"cer"];
NSData * cerData = [NSData dataWithContentsOfFile:cerPath];
manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:[[NSSet alloc] initWithObjects:cerData, nil]];
manager.securityPolicy.allowInvalidCertificates = YES;
[manager.securityPolicy setValidatesDomainName:YES];
- info.plist配置白名单
<dict>
<key>NSAllowsArbitraryLoads</key>
<false/>
<key>NSExceptionDomains</key>
<dict>
<key>cer文件中查看</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.0</string>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
2.防止别人获取App敏感信息的常用方式?(10分)
1.URL编码加密
对iOS app中出现的URL进行编码加密,防止URL被静态分析
2.本地数据加密
对NSUserDefaults,sqlite存储文件数据加密,保护iOS app的帐号和关键信息。
3.网络传输数据加密
对iOS app客户端传输数据提供加密方案,有效防止通过网络接口的拦截获取
4.方法体,方法名高级混淆
对iOS app的方法名和方法体进行混淆,保证源码被逆向后无法解析代码
5.程序结构混排加密
对iOS app逻辑结构进行打乱混排,保证源码可读性降到最低
6.使用keychain来存储用户信息,也就是钥匙串,使用keychain需要导入Security框架
7.阻止动态调试
3.加密算法
- 哈希(散列)函数
- MD5(密码密文、搜索、版权、文件完整性校验)
- SHA1(弱哈希算法使用漏洞)
- SHA256/512 (安全)
- Base64(一般用于图片、视频上传处理)
- 对称加密算法(DES、AES)
加密/解密使用相同的秘钥
- 非对称加密算法(RSA)
公钥加密,私钥解密
- SSKeyChain(支持对存储在钥匙串中密码、账户进行访问,包括读取、删除和设置)
①对称加密-非对称加密
对称加密:解密加密都用同一个密钥来进行
- 优点
算法公开,计算量小,加密速度快,加密效率高
双方使用相同的钥匙,安全性得不到保证 - 缺点
如果用户一旦多的话,管理密钥也是一种困难。不方便直接沟通的两个用户之间怎么确定密钥也需要考虑,这其中就会有密钥泄露的风险,以及存在更换密钥的需求。
对称加密通常有 DES,IDEA,3DES 加密算法。
②非对称加密
==算法强度复杂,安全性依赖于算法与密钥==。 加密解密速度慢。
用公钥和私钥来加解密:。即A 的公钥加密过的东西只能通过 A 的私钥来解密;同理,A 的私钥加密过的东西只能通过 A 的公钥来解密。顾名思义,公钥是公开的,别人可以获取的到;私钥是私有的,只能自己拥有。
- 缺点
加解密比对称加密耗时. - 优点
比对称加密安全.
应用场景
非对称和对称加密各有优缺点,一般把两者结合
在实际应用中,通常采取 数据本身的加密和解密使用对称加密算法(AES)。
用RSA算法加密并传输对称算法所需的密钥
③Base64加密原理
使用64个字符来对任意数据进行编码,同理有Base32、Base16编码
64字符为:大写A-Z,小写a-z,数字0-9,+和/
本质上是一种将二进制数据转成文本数据的方案
对于非二进制数据,是先将其转换成二进制形式,然后每连续6比特(2的6次方=64)计算其十进制值,根据该值在上面的索引表中找到对应的字符,最终得到一个文本字符串.
使用场景
- 邮件
- 如果纯文本数据包含不可见字符,就需要使用base64
- 简单加密(所以看到字符串中包含大小写和等号,很可能就是base64编码)
- URL编码
为什么
- base64编码具有不可读性,即所编码的数据不会被人直接看出
- 编码后比原字符多出1/3的空间
- 我们知道在计算机中任何数据都是按ascii码存储的,而ascii码的128~255之间的值是不可见字符。而在网络上交换数据时,比如说从A地传到B地,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。所以就先把数据先做一个Base64编码,统统变成可见字符,这样出错的可能性就大大降低了
- ASCII-美国信息交换标准代码
使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符