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

攥写自 Chad Brubaker,Android 安全部门高级软件工程师。

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

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

如何更新我的 APP 呢?

如果你 app 的所有网络请求已经使用上了 TLS,那么你什么都不用做。但如果不是,你则是需要使用 TLS 来加密你所有的网络请求。如果你仍然需要发起明文传输的请求,继续往下读读看吧。

为什么我需要使用 TLS 呢?

Android 系统认为所有网络都可能是具有敌意的,因此应始终使用加密流量。移动设备则是更加容易受到攻击,因为它们经常性地链接到许多不同的网络,比如咖啡店的 Wi-Fi。

所有的网络传输都应该被加密,无论它们传输的何种内容,因为任何未加密的连接都可能被攻击并被注入额外内容,让潜在拥有脆弱防护性能的客户端代码更能够被多点击破,或是用来跟踪用户。如要获取更多的讯息,请查看我们之前的文章 protecting-against-unintentionalDeveloper Summit talk

TLS 会很慢吗?

当然不是!

如何在我的 APP 中使用 TLS?

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

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

我还是需要使用明文传输...

当然你真的应该在所有链接中使用 TLS,但有可能由于历史原因你还是需要使用明文传输,比如连接上一台无人维护的老旧服务器。要这样做,你需要配置 APP 的网络安全设置来允许这些连接。

我们已经有了一些这样的范例配置。请查看 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 来检查其行为可行性。


本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逸鹏说道

上传文件的陷阱

0x00 背景 现在很多网站都允许用户上传文件,但他们都没意识到让用户(或攻击者)上传文件(甚至合法文件)的陷阱。 什么是合法文件? 通常,判断文件是否合法会透...

3447
来自专栏编程

如何建立一个OpenVPN服务器在Ubuntu 14.04

当连接到不受信任的网络(例如酒店或咖啡店的WiFi)时,是否想从智能手机或笔记本电脑安全,安全地访问互联网?虚拟专用网络(VPN)允许您将不可信的网络私密安全地...

6601
来自专栏张戈的专栏

启用某些Linux发行版的root帐号

跟了我 5 年多的本本已步入花甲,CPU 严重老化,运行 Windows 异常吃力,于是考虑换成 Linux 试试。忙活了一天,测试了 2 个“家用”Linux...

3844
来自专栏Hadoop实操

如何禁止Namenode格式化

众所周知,Namenode存放Hadoop集群的元数据,Datanode存放数据。如果Namenode被格式化,那意味着整个集群的数据将全部丢失。除非元数据有备...

1868
来自专栏WindCoder

JSON Web Token(JWT)教程:一个基于Laravel和AngularJS的例子

这是一篇介绍JSON Web Token(JWT)的文章,虽然可能用到的例子和Laravel和AngularJS有关,但知道了原理便能写出适用于自己的。同时,由...

2801
来自专栏mukekeheart的iOS之旅

iOS学习——如何在mac上获取开发使用的模拟器的资源以及模拟器中每个应用的应用沙盒

如题,本文主要研究如何在mac上获取开发使用的模拟器的资源以及模拟器中每个应用的应用沙盒。做过安卓开发的小伙伴肯定很方便就能像打开资源管理器一样查看我们写到手...

3047
来自专栏前端笔记

【HTTP2.0 协议】就“腾讯云 CDN 针对 HTTP 2.0全面公测”浅谈如何启用 HTTP 2.0协议?

HTTPS 是指超文本传输安全协议(Hypertext Transfer Protocol Secure),是一种在 HTTP 协议基础上进行传输加密的安全协...

5129
来自专栏散尽浮华

OpenVPN简单部署笔记

打算在IDC机房部署VPN环境,Openvpn也是一个不错的选择:开源,好用,而且免费。 OpenVPN简单介绍 OpenVPN是一个用于创建虚拟专用网络(Vi...

9987
来自专栏python爬虫实战之路

知乎模拟登陆

经常在简书上写作,写完后再发布到其他网站,非常麻烦,所以准备搞一下自动发布文章的工具。那么第一步先要模拟登陆几个网站。今天先从知乎开始。

1233
来自专栏FreeBuf

如何在macOS上监听单个应用HTTPS流量

写在前面的话 如果你准备对网络协议进行逆向分析或进行任何与网络安全有关的活动时,可能是为了了解协议运行机制,也有可能是为了查找敏感信息,你或多或少都需要收集一定...

2545

扫码关注云+社区