[譯] 在 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前端後端區塊鏈產品設計人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章
相關標籤/搜索