本文首发于《iOS 成长之路》,购买可查看更多 WWDC 系列文章,转载请联系做者。算法
如今,咱们愈来愈关注用户的隐私和信息安全,可是随着时间的推移,计算机变得愈来愈高效,那些年代久远的网络协议和加密算法,在新的硬件和攻击方式下,变得朝不保夕。安全
这里总结了一些常见的网络攻击,它们针对的对象有所不一样,有的是想窃取数据,有的是想假装身份,它们在图中以颜色进行区分。我将会经过一些实践来告诉你,如何去避免这些攻击,具体来讲就是关于加密(encryption)、密码散列(cryptographic hashes)、公共密钥(public keys)、网络协议(protocols)、证书吊销检查(revocation)等内容的一些实践。bash
如今大多数的 App 网络都已经切换到 HTTPS 了,HTTPS 其实就是在 HTTP 下加入了 TLS 层,TLS 是保证网络安全的基础,它能够对传输内容加密、进行身份验证、避免传输内容被篡改。网络
TLS 协议是由 TLS 握手协议和 TLS 记录协议两部分组成,TLS 记录协议负责对传输内容加密,TLS 握手协议又分为四个子协议,负责协商加密算法、共享密钥、传达警告等工做。app
TLS 协议中涉及到多种不一样的密码技术,好比在握手协议中使用到了非对称加密、散列函数、数字签名技术,在 TLS 记录协议中使用到了对称加密、散列函数等技术。具体的这些技术,在下面会详细介绍,而且说明哪些技术已通过时了,须要更换更安全的加密算法来保证安全。tcp
本文中,涉及到一些加密算法,根据密钥的使用方式,能够分为对称加密和非对称加密:ide
除了上述两种加密算法,还有一些用来确保信息完整性和身份认证的技术:函数
加密是咱们众所周知的用来防止信息被窃听的手段,可是一些加密算法已经很是不安全,很容易被攻击者攻破。特别是 RC4, 目前能够在短短三天以内就能够攻破它。并且,Triple-DES 和 AES 加密算法在 BEAST 和 Lucky 13 这些攻击面前,也没法保证安全性。苹果正在计划在全部平台上弃用 Triple-DES 和 RC4,同时也不推荐使用 AES-CBC 算法,可是还没给出具体的日期。Apple 推荐咱们使用 AES-GCM 或者 ChaCha20/Poly1305 算法。性能
密码散列会有一个输入值和一个输出值,输入的称为消息,输出的称为散列值。密码散列会根据输入的内容计算一个散列值出来,这个散列值能够用来判断信息是否完整。可是其中一些密码散列已经不安全了,黑客能够经过碰撞攻击的方式来篡改数据。碰撞攻击是经过大量的尝试,来找到不一样的输入值,可是输出值是同样的状况,进而篡改数据。由于篡改后的散列值并无发生变化,因此你没法判断数据是否被修改过。测试
MD-5 和 SHA-1 已经不安全了,Apple 已经在前几年在移除了 MD-5 算法的签名证书。SHA-1 在今年的早些时候,也遭遇了攻击。因此,Apple 将也再也不信任 SHA-1 算法的签名证书。为了保证绝对的安全,开发者应该使用 SHA-2 算法。
通常状况下,通过公钥加密的内容,只能经过私钥打开加密内容。可是,768 位的 RSA 在2009 年被攻破,Apple 在 2016 年春天已经移除了对 1024 位如下 RSA 签名的证书的支持。由此来看,对 1024 位 RSA 加密的攻击也快要来到了,因此 Apple 也宣布将再也不对 2048 位如下 RSA 签名的证书信任。你应该使用 2048 位以上的 RSA 加密,或者其余 Apple 平台信任的椭圆曲线密码。
若是开发者正在使用HTTP协议,那就表明着你传输的内容,任何监听者均可以获取到。同时,一些老化的 TLS 版本,也是不安全的,好比 SSL 3.0、TLS1.1 和 TLS1.0。应该避免使用这些协议,开发者应该使用基于 TLS1.2 的 HTTPS 协议。
同时,Apple 宣布发布 TLS 1.3 Beta 版,后续会详细讲。
当私钥泄漏或者或者其余一些状况出现时,咱们可能须要吊销证书。客户端在收到证书的时候,须要确认证书的吊销状况。
Apple平台默认是不进行吊销检查的。目前存在的吊销机制有如下几种:
尽管 Apple 鼓励开发者在服务端采用 OCSP Stapling 这种方式,可是普及程度远远不够。Apple 同时宣布增强在全部平台的证书吊销验证。Apple 会从 Certificate Transparency log 中获取信赖的证书列表,开发者和CA均可以向 Certificate Transparency log 提交证书,提交的证书会受到监控和审计。而后 Apple 会从证书颁发机构查询证书的吊销状态,把全部吊销证书的信息捆绑到一块儿,每隔一段时间自动下发给客户端设备,这样客户端就能够周期性的验证证书的吊销状态了。
在进行 TLS 会话时,若是发现证书在吊销列表内,那么客户端则执行一次 OCSP 检查,去校验证书是否真的已经被吊销。若是证书没有在吊销列表中,则不进行 OCSP 检查。这样的话,客户端通常就不须要向 CA 发送额外的网络请求,避免了性能问题。
Apple 关于加密、散列函数、网络协议、证书吊销校验和公钥密码方面的修改如图所示:
在 Safari 中从新设计了新的证书报错界面,若是你用了不符合要求的证书,那么将会看到以下界面。
能够经过证书查看器,进一步查看证书错误的详细状况。
ATS 在 iOS 9 的时候推出,是为了保证开发者使用加密的网络来传输数据。可是 Apple 发现所有转为 ATS 的过渡期要比预期长,因此 Apple 扩大了对 ATS 的豁免的支持。
去年 Apple 发现目前的 ATS 豁免并不能知足全部开发者的需求,因此就开放了对AVFoundation、WebView 和 Webkit 的单独豁免支持。豁免能够限制在一个单一域名内和整个 App 内,同时也支持对本地网络(原始 IP 地址和不合格的主机名)的豁免。
虽然目前扩大了对豁免的支持,可是 Apple 依然相信使用 ATS 才是正确的选择,依然会积极推荐 ATS 的使用。
TLS 的前身其实就是 SSL(Secure Sockets Layer),Netscape 是最先发布 SSL 的公司,后续因为互联网标准化组织的接手,将 SSL 标准化,并在 1999 年将其称为 TLS(Transport Layer Security)。后续又在 2006 年 4 月对 TLS 1.0 进行了更新,这个版本与 1.0 差别不大。2008 年发布了 TLS 1.2,也就是目前 Apple 推荐在 HTTPS 网络上使用的协议。
TLS 1.3 是正在制定的 TLS 新标准,目前仍是草案版本。
在 WWDC 上 Apple 阐述了 TLS 1.3 相比 TLS 1.2 的一些改变:
关于第四点应该是咱们最关心的优化点,TLS 握手从原来的四次握手变成了两次握手,也就是说减小了一个 RTT,TLS 1.3 的密钥交换和加密算法的协商都放在了一块。因为这套更高效的握手方法,Apple 宣布大概能够减小三分之一的握手延迟。
虽然正式的版本还没发布,可是如今你能够对 TSL 1.3 beta 版本进行测试了,你能够在 developer.apple.com/go/?id=tls1… 下载安装一个配置文件在手机上,同时手机系统升级到 iOS 11 就能够体验最新的 TLS 协议了。同时,在 macOS High Sierra 中,能够经过如下终端命令启用 TLS 1.3。
defaults write /Library/Preferences/com.apple.networkd tcp_connect_enable_tls13 1复制代码