[譯] 在 Android P 中使用預設的 TLS 來保護你的使用者

Android_開發者發表於2018-06-20

攥寫自 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 來檢查其行為可行性。


掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 AndroidiOS前端後端區塊鏈產品設計人工智慧等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章