[译] 在 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 条评论
登录 后参与评论

相关文章

来自专栏WindCoder

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

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

4351
来自专栏张戈的专栏

CCKiller:Linux轻量级CC攻击防御工具,秒级检查、自动拉黑和释放

张戈博客很久以前分享过一个CC 攻击的防御脚本,写得不怎么样,不过被 51CTO 意外转载了。博客从此走上了经常被人拿来练手的不归之路。 当然,还是有不少朋友在...

6376
来自专栏前端笔记

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

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

6329
来自专栏逸鹏说道

上传文件的陷阱

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

3537
来自专栏张戈的专栏

CCKiller:Linux 轻量级 CC 攻击防御工具

很久以前分享过一个CC攻击的防御脚本,写得不怎么样,不过被51CTO意外转载了。博客从此走上了经常被人拿来练手的不归之路。当然,还是有不少朋友在生产环境使用,并...

1.7K0
来自专栏V站

一张验证码引发对DOS的思考

他的目的就是为了让攻击目标网站或者在线服务失去相应,或者因为大量流量和IP一时间如洪水般涌入服务器,导致服务器拒绝服务,甚至宕机。

1572
来自专栏云端架构

【云端架构】常见电脑开放端口及含义

说明:通常用于分析操作系统。这一方法能够工作是因为在一些系统中“0”是无效端口,当你试图使用通常的闭合端口连接它时将产生不同的结果。一种典型的扫描,使用IP地址...

6217
来自专栏小樱的经验随笔

【干货分享】常用端口服务对照表

端口:0 服务:Reserved 说明:通常用于分析操作系统。这一方法能够工作是因为在一些系统中“0”是无效端口,当你试图使用通常的闭合端口连接它时将产生不...

4545
来自专栏FreeBuf

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

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

2645
来自专栏流柯技术学院

通过Google身份验证器加强Linux帐户安全

而后,google的验证模块就会被复制到/lib64/security目录下,而用来生成密钥的可执行程序:google-authenticator,则复制到/u...

1551

扫码关注云+社区

领取腾讯云代金券