[译] 在 Android P 中使用默认的 TLS 来保护你的用户

在 Android P 中使用默认的 TLS 来保护你的用户

攥写自 Chad Brubaker,Android 安所有门高级软件工程师。html

Android 一直致力于保护其用户,用户的设备以及用户数据的安全。其中一种咱们保持数据安全的方式是让全部进入或离开 Android 设备的数据经过安全传输层(TLS)来通讯。如同咱们在 Android P 预览版中宣布的同样,咱们正在经过阻止目标为 Android P 的应用在默认状况下容许未加密的链接这一行为来进一步改进这些保护措施。前端

伴随着多年来咱们为了更好地保护 Android 用户所作出的改变。为了防止意外的非加密链接,咱们在 Android Marshmallow 中引入了新的 manifest 属性 android:usesCleartextTraffic。在 Android Nougat 中,咱们经过建立 Network Security Config 来扩展了这个属性,用来代表 app 并无使用加密网络连接的倾向。在 Android Nougat 和 Oreo 中, 咱们仍然容许明文传播。java

如何更新个人 APP 呢?

若是你 app 的全部网络请求已经使用上了 TLS,那么你什么都不用作。但若是不是,你则是须要使用 TLS 来加密你全部的网络请求。若是你仍然须要发起明文传输的请求,继续往下读读看吧。android

为何我须要使用 TLS 呢?

Android 系统认为全部网络均可能是具备敌意的,所以应始终使用加密流量。移动设备则是更加容易受到攻击,由于它们常常性地连接到许多不一样的网络,好比咖啡店的 Wi-Fi。ios

全部的网络传输都应该被加密,不管它们传输的何种内容,由于任何未加密的链接均可能被攻击并被注入额外内容,让潜在拥有脆弱防御性能的客户端代码更可以被多点击破,或是用来跟踪用户。如要获取更多的讯息,请查看咱们以前的文章 protecting-against-unintentionalDeveloper Summit talkgit

TLS 会很慢吗?

固然不是!github

如何在个人 APP 中使用 TLS?

一旦你的服务器端支持了 TLS,你只要简单地将 App 和服务器响应的 URL 从 http:// 改变成 https://。你的 HTTP 堆栈将会自动地处理好相关事宜。后端

若是你须要本身处理套接字,请使用 [SSLSocketFactory] 而不是 [SocketFactory]。请必定要特别注意正确地使用套接字,由于 [SSLSocket] 没有提供主机名的验证。你的 APP 须要本身来处理主机名验证,最好经过调用 [getDefaultHostnameVerifier()] 来处理主机名。而是,当你调用 HostnameVerifier.verify() 时必定要谨慎,它没有抛出任何异常或者错误,相反它返回了一个须要明确检查值的布尔值结果。安全

我仍是须要使用明文传输...

固然你真的应该在全部连接中使用 TLS,但有可能因为历史缘由你仍是须要使用明文传输,好比链接上一台无人维护的老旧服务器。要这样作,你须要配置 APP 的网络安全设置来容许这些链接。bash

咱们已经有了一些这样的范例配置。请查看 network security config 来得到更多的帮助。

容许特殊的域名使用明文传输

若是您须要容许链接到特定域名或一组域名,可使用如下配置做为指导:

<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">insecure.example.com</domain>
        <domain includeSubdomains="true">insecure.cdn.example.com</domain>
    </domain-config>
</network-security-config>
复制代码

容许链接到任意不安全的域名

若是您的应用支持经过不安全链接从 URL 打开任意内容,你只需设置与本身的服务器通讯时才使用加密传输。时刻记住,当心处理你从非安全链接获得的数据,它们可能已经在传输过程当中被篡改。

<network-security-config>
    <domain-config cleartextTrafficPermitted="false">
        <domain includeSubdomains="true">example.com</domain>
        <domain includeSubdomains="true">cdn.example2.com</domain>
    </domain-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>
复制代码

如何更新个人库呢?

若是你使用的库直接地建立了安全或者非安全的链接,确保它们在发起任意明文传输请求前调用过 isCleartextTrafficPermitted 来检查其行为可行性。


掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 AndroidiOS前端后端区块链产品设计人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划官方微博知乎专栏

相关文章
相关标签/搜索