1 对称加密
加密解密是同一个密钥,加解密速度快,常见的有DES,3DES,AES128,AES256等。DES已经不再安全,现在推荐使用AES。对称加密存在的问题是密钥配送问题。开发中一般是将密钥保存于客户端和服务器两端,这样的问题是密钥始终是同一个,一旦泄漏则产生危险。
2 非对称加密
存在一对相匹配的公钥和私钥,公钥加密则私钥解密,私钥加密则公钥解,加解密速度慢。一般使用RSA算法。非对称加密很好的解决了对称加密中密钥配送问题,但是加解密速度慢是一个很大缺陷。
3 混合密码
为了使通信过程安全且兼顾加解密效率,广泛采用的是混合密码加密,A发送内容(内容的容量大,加密速度有要求)给B流程整理如下
3.1 A对B说,把公钥给我
3.2 B生成一对公钥/私钥,并将公钥给A
3.3 A随机生成一个随机数字串
3.4 A用生成的数字串对需要发送的内容加密(AES对称加密)
3.5 A用从B获取到的公钥对数字串进行加密(RSA非对称加密)
3.6 A将4/5两部得到的加密结果,一起发送给B
B得到A发送的内容后解密过程如下
3.7 B利用自己的私钥对3.5内容解密,得到数字串(RSA解密)
3.8 B利用数字串对3.4内容解密,得到发送内容(AES解密)
4 中间人攻击
中间人攻击就是伪造公钥,让通信双方都以为自己正在跟对方通信,但实际信息已经被窃取。防止的措施就是利用证书验证公钥。
4.1 证书,全称叫公钥证书,里面存在公钥,以及所属姓名,邮箱,以及认证机构(CA)施加的数字签名。
证书申请流程大概如下
4.2 B生成公钥私钥对
4.3 B在认证机构认证自己的公钥
4.4 认证机构对公钥进行数字签名生成证书
此时,A要对B发送消息时,在上面的3.3之前需要增加一个步骤,进行公钥验证。A从认证机构获取证书,拿到公钥,比对从3.2得到的公钥,验证合格才能进行后续流程,避免了中间人攻击。
5 https
https的加密也是采用混合密码,跟上面的流程完全一样。这里要说下的是在iOS开发中公钥验证需要做什么。
5.1 如果你用的是付费的公信机构颁发的证书,标准的https,那么无论你用的是AF还是NSUrlSession,什么都不用做,代理方法也不用实现,你的网络请求就能正常完成。公钥验证时,苹果手机会从公信机构获取证书完成验证过程。
5.2 如果用的是自签名的证书,首先你需要在plist文件中,设置可以返回不安全的请求(关闭该域名的ATS),AFN时需要设置如下代码
policy.allowInvalidCertificates = YES;
policy.validatesDomainName = NO;
一般的,需要把自签名的服务端证书,或者自签的CA根证书,是一个.cer文件,导入到项目中。再写上如下代码
NSString *certFilePath = [[NSBundle mainBundle] pathForResource:@"AFUse_server.cer" ofType:nil];
NSData *certData = [NSData dataWithContentsOfFile:certFilePath];
NSSet *certSet = [NSSet setWithObjects:certData,certData, nil];
policy.pinnedCertificates = certSet;
6 单向散列函数
又名消息摘要函数,哈希函数,根据消息算出散列值。特点如下
- 散列值长度固定,和消息长度无关
- 计算速度快
- 消息不同,散列值不同
- 单向性
常见的单向散列函数有MD5,SHA,这两种均不再安全,推荐使用SHA256/SHA512。
7 数字签名
数字签名就是使用自己的私钥对信息进行加密,作用是确认信息的完整性,举例:A发送数据给B,则对B能确认数据是否是A所发,且能确认数据是否被人篡改。
上面的流程中,A发送给B的内容包括消息体(明文传输)和签名,签名之前先对消息体进行单向散列函数的目的是减小消息体长度,加快加密速度。
上面流程的问题是明文传输,如下方式可以解决这个问题
8 iOS打包签名
参考文献
http://www.cocoachina.com/ios/20161220/18393.html
https://www.cnblogs.com/SirSmith/p/4985571.html
http://blog.cnbang.net/tech/3386/
网友评论