查看原文
其他

如何防止 Android 应用意外回退到明文通信方式?

2016-06-02 DevRel 谷歌开发者


当您的应用使用明文网络通信(例如 HTTP)与服务器通信时,通信将可能被第三方窃听和篡改。这可能会泄露有关您的用户的信息并敞开应用的大门,使之可能被注入未经授权的内容或遭到非法利用。理想情况下,您的应用应当仅使用安全通信,例如使用 HTTPS 取代 HTTP。此类通信受到保护,可防止遭到窃听和篡改。


许多 Android 应用已经仅使用安全通信。然而,有些应用偶尔会意外回退到明文通信方式。例如,某个服务器组件中的某个意外改动可能会导致服务器为应用提供 HTTP URL,而不是 HTTPS URL。随后,该应用会继续以明文方式进行通信,而不会有任何用户可见的提示。应用的开发者和用户可能不会觉察到这种情况。


甚至,即便您相信您的应用仅使用安全通信,也请务必使用 Android Marshmallow (Android 6.0) 提供的新机制来发现并防止意外的回退。

新的保护机制
对于仅使用安全通信的应用,Android 6.0 Marshmallow(API 级别 23)引入了两种机制来解决回退到明文通信的问题:(1) 在生产/安装库中,禁止明文通信,以及 (2) 在开发/QA 期间,在遇到任何非 TLS/SSL 通信时,予以记录或者触发崩溃。下文将更详细地介绍这两种机制。

在生产库中禁止明文通信
要防止应用的安装库回退到明文通信,请在应用的 AndroidManifest.xml 文件中,在 application 元素中声明android:usesCleartextTraffic=”false” 属性。此声明指示该应用不使用明文网络通信,并使 Android Marshmallow 的平台网络堆栈禁止该应用中的明文通信。例如,如果您的应用意外尝试通过 HTTP 明文请求登录用户,该请求将被阻止,该用户的身份和密码信息不会泄露到网络上。
您不必将应用的 minSdkVersion 或 targetSdkVersion 设置为 23 (Android Marshmallow),也可使用android:usesCleartextTraffic。在早期平台上,此属性会直接被忽略,因此,不会有任何影响。
请注意,WebView 尚不支持此功能。
在特定的情形下,明文通信可能仍会进出应用。例如,套接字 API 会忽略明文策略,因为它并不知道其收发的数据是否可被归类为明文。另一方面,Android 平台 HTTP 堆栈则遵从此策略,因为它们知道通信是否为明文。
Google AdMob 的设计也遵从此策略。如果您的应用声明其不使用明文通信,则只能通过该应用提供 HTTPS 广告。
建议使用第三方网络、广告和分析库,以增强对此策略的支持。它们可以通过 NetworkSecurityPolicy 类查询明文通信策略。



在开发期间检测明文通信
要在开发或 QA 期间检测出明文通信,可使用 StrictMode API 修改应用,使之检测非 TLS/SSL 通信,然后将违规情形记录到系统日志中或者使应用崩溃(参阅 StrictMode.VmPolicy.Builder.detectCleartextNetwork())。该工具很有用,可帮助识别应用的哪些数据使用非 TLS/SSL(和 DLTS)通信。与 android:usesCleartextTraffic 属性不同,在面向用户发行的应用版本中,不会启用此功能。
首先,此功能将会标记非 TLS/SSL 的安全通信。更重要的是,还可能会标记通过 HTTP 代理的 TLS/SSL 通信。这会带来问题,因为作为开发者,您无法控制应用的某个用户是否会配置其 Android 设备使用 HTTP 代理。最后,此功能并非永不过时,可能不适应未来的 TLS/SSL 协议版本。因此,此功能仅应用于开发和 QA 阶段。



在 Network Security Config 中声明更精细的明文策略
Android N 提供对明文通信策略的精细控制功能。与应用于应用通信所有目标端的 android:usesCleartextTraffic 属性相反,Android N 的 Network Security Config 允许应用针对特定的目标端指定明文策略。例如,为了方便更平滑地过渡到不允许明文通信的策略,应用首先仅禁止使用明文与其最重要的后端进行通信,而允许使用明文与其他目标端进行通信。



未来计划

在您的应用与服务器之间仅使用安全网络通信方式进行通信,是一种安全最佳做法。借助 Android Marshmallow,您可以实施这一做法,赶紧试试吧!


我们一如既往地感谢您的反馈,欢迎就改进 Android 提供宝贵建议。请通过 security@android.com 联系我们。



原文来自【Android 开发者全球博客】

android-developers.blogspot.com

中文翻译文章【中国谷歌开发者社区论坛】(文末阅读原文):

chinagdg.com/thread-32313-1-1.html


6.2 Google Doodle: 2016 年意大利共和国日


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存