回顾了一下唐巧的一个直播 圣诞节之夜,聊聊 iOS 的安全和 ATS ,对 iOS 的这块的安全有了新的了解,特此笔记。
疑问:iOS Vs Android 谁的安全性更高?
大部分情况下,Android的安全性确实没有 iOS 高,但是有两个点需要注意下:
平台统一性带来的单点风险
例如某个问题黑客攻破了,对于 iOS 来说就是全部攻破啦,但是对 Android 来说却是有可能只针对某种类型的安卓手机,毕竟不同的厂商都有这自己的定制,各有各的问题。用户安全意思更加薄弱
iOS 用户的安全意思更加薄弱,不会注意这块,至少很少看到 iOS 手机上装一些 手机安全的 App。
iOS 开发者也是一样,安卓开发者通常会涉及一些反混淆,加壳之类的,安全性意识自然不同。
iOS 安全的三个层面
- iOS 用户平台的安全
- iOS 用户升级时软件的安全
- iOS 开发者安全
一、平台安全
- 芯片级的安全逻辑
- 数据层面的保护
- 代码签名
- 沙盒
- Touch ID
iOS 上的平台安全可以从上述五个部分来说明。
1.1 芯片级的安全逻辑
将所有的安全逻辑全放在芯片中,里面有一个Apple Public Key 放在硬件中,每一次启动时都需要对这个公钥进行如下图中一层一层的验证。
这样的话,要修改这个逻辑是相当麻烦的,同时 苹果还做了以下处理,保证其验证的安全性。
- Public Key 由苹果提供,并不可伪造。
- 设备的每次软件升级,都需要苹果的独立认证。
1.2 数据层面的保护
将内容进行加密,用户数据不是简单的通过passcord 加密的,而是把 passcode 作为种子,加上硬件信息共同生成的加密密钥。
这个密钥自然很长,这个密钥还和设备相关,当换一个手机时这个手机信息自然不同的,所以暴力破解还只能在同一个手机上。超过 10 次失败,会被拒绝再尝试。
1.3 沙盒
将应用数据隔离
独立存在,无法感知其他应用的信息所有权限获得,需要经过用户同意
所有权限都被沙盒挡住啦
有沙盒的存在,大部分的应用是无法做坏事的。
1.4 代码签名
声明下:我们所有开发的应用,都是需要签名的。
包括整个操作系统,以及所有应用,都在 code signing 的检查下运行。
另外想想当初被 签名证书这块麻烦事还是印象很深刻的,现在理解了为什么啦。
1.5 Touch ID
反正现在涉及到支付这块的安全,我一般都是直接使用指纹密码的,下图是苹果官方的统计,也说明了 Touch ID 的使用频率,它的安全自然是需要注意的。
- 指纹采集器
- 安全通道
- 安全模块识别
整个通讯都是在硬件上执行,所以这一点保护我们指纹信息是安全的。
二、用户升级的安全
先不说升级的安全,但是在iOS 9的升级的时候发现其体积变小了,对于像我这种 16 G 的用户还是很高兴的。
- 减少操作系统的体积
- 大版本的升级是上面那样的,小的升级确是用增量的方式升级的,毕竟升级包没那么大的。
而安全这块,则是苹果通过升级,可以将一些已知的漏洞可以很快解决掉,安全性自然就高啦。
所以此处也给了我们多一个升级的理由。
三、开发者的安全
App Transport Security
它本质上就上说要我们开发者直接用 HTTPS 请求。
-
HTTPS == HTTP + Security(SSL/TLS)
-
什么是 Security(SSL/TLS) ?
它们是在传输层上数据的加密, SSL 是以前的版本的协议,TLS 是现在版本的协议,苹果也是要求其 TSL 1.2 版本之后的 HTTPS。
-
对于我们开发者来说,需要做什么呢?
- 服务端
买证书,买权威认证的证书 -
客户端
此处先了解一下 NSExceptionDomains 这块的例外,之前没用到过,还不太清楚...
另外注意下对 nscurl 的使用,我们搭建完HTTPS服务器之后,可以使用nscurl命令来进行检测,查看建立的HTTPS服务器是否能通过ATS特性。
nscurl --ats-diagnostics --verbose https://example.com
如果HTTPS服务器能通过ATS特性,则所有测试案例都是PASS;如果某一项的Reuslt是FAIL,就找到ATS Dictionary来查看,就能知道HTTPS服务器不满足ATS哪个条件。
开发者这块的安全主要是指 App Transport Security, 通过 HTTPS 更好的保护我们数据的安全性。
整个下来,感觉对 我们 iOS 这块的安全,确实有了新的认识,同时再次提醒了我们 iOS 开发者还是要多看看 WWDC 的视频。