你真的瞭解Android金鑰庫嗎?
Android 的金鑰庫已經推出很多年了,它為應用開發者提供了一種使用加密金鑰進行身份驗證和加密的方式。金鑰庫將金鑰資料存放在應用的程式空間之外,因此,金鑰資料不會在可能受到網路釣魚攻擊的情形下被應用意外透露給使用者,不會通過其他某種渠道洩漏,也不會在應用遭到入侵時陷入危險之中。
許多裝置也在安全硬體中為金鑰庫金鑰提供基於硬體的安全機制,這種機制將金鑰資料完全儲存在 Android 系統之外,因此即使 Linux 核心遭受入侵,金鑰資料也不會洩漏。在絕大多數 Android 裝置中,安全硬體都是主 CPU 的一種特殊模式,其通過硬體與 Linux 核心及 Android 使用者空間強制隔離。有些裝置還使用單獨的安全微處理器。
Android 提供的 API 可以讓應用確定給定金鑰庫金鑰是否處於安全硬體中,但是如果作業系統受到入侵,這些 API 將變得不可靠。金鑰認證讓裝置的安全硬體可以驗證某個非對稱金鑰是否處於安全硬體中,從而在 Android OS 遭受入侵時為金鑰提供保護。
金鑰庫歷史
金鑰庫最初在 Android 4.0 中引入,金鑰採用使用者的密碼進行加密。Android 4.1 新增了使用裝置安全硬體的基礎架構。
在 Android 6.0 之前,金鑰庫僅支援 RSA 和 ECDSA。在 Android 6.0 中,金鑰庫得到顯著增強,增加了對 AES 和 HMAC 的支援。此外,加密運算的其他關鍵要素(例如 RSA 補位1 和 AES 區塊連結2 模式)也移入安全硬體中。
在 Android 6.0 中,金鑰庫還能夠限制特定金鑰的使用方式。可以應用的最有用限制是 使用者身份驗證繫結。這種限制允許將金鑰的使用“繫結”到使用者密碼(他們的 PIN 碼、圖案或口令)或者指紋。對於密碼身份驗證繫結,應用開發者可以指定一個超時(以秒為單位)。如果自使用者上次輸入密碼以來所經歷的時間已超過指定時間,安全硬體將拒絕要求使用金鑰的任何請求。指紋繫結金鑰在每次使用金鑰時都會要求新的使用者身份驗證。
還可以向 Android 6.0+ 金鑰應用其他更多技術限制。特別是,在建立或匯入金鑰時,需要指定金鑰可用於哪些加密目的(加密、解密、簽名或驗證),為初始化向量或隨機數指定補位與分組加密模式、摘要和熵源以及加密運算的其他詳細資訊。由於指定的資訊以加密方式永久繫結到金鑰資料上,金鑰庫將不允許以任何其他方式使用此金鑰。因此,已經獲取應用或系統控制許可權的攻擊者無法濫用金鑰。為了幫助防止攻擊,開發者應為給定金鑰指定儘可能窄的使用者範圍。
Android 7.0 中引入了 Android 金鑰庫最重要的變更之一。預裝 Android 7.0+ 並帶有安全鎖定螢幕的新釋出裝置必須具有安全硬體,並支援基於硬體的密碼身份驗證和金鑰庫金鑰。在 Android 7.0 之前,安全硬體支援比較分散,不過在未來幾年,這項功能將逐漸統一。
在 Android 8.0 中,金鑰認證已成為預裝 Google Play 的所有新裝置的強制選項。
為何使用金鑰認證?
假設您正在開發一款應用,該應用讓銀行客戶可以訪問其銀行餘額、交易歷史記錄和賬單支付系統。安全性至關重要;您肯定不希望撿到使用者電話的任何人都能訪問使用者的銀行賬戶。一種應對方式是使用使用者的網站密碼。但是這種方式對使用者來說通常不方便,因為網站經常需要複雜的長密碼,在小型觸控式螢幕上輸入這類密碼不是很方便。
藉助 Android 金鑰庫,您可以生成一個非對稱的身份驗證金鑰(例如 256 位 ECDSA 金鑰),讓每位使用者使用他們的複雜網路密碼登入一次,然後在銀行的客戶賬戶資料庫中註冊公鑰。在使用者每次開啟應用時,您都可以使用該 ECDSA 金鑰執行一次質詢-響應身份驗證協議。而且,如果您進行金鑰身份驗證繫結,使用者在每次開啟應用時還可以使用他們的鎖定螢幕密碼或指紋進行身份驗證。這樣一來,他們可以在自己的電話上使用更簡單、更方便的身份驗證機制。
如果攻擊者入侵 Android 並嘗試提取金鑰,他們可能會無功而返,因為金鑰儲存在安全硬體中。
作為一名應用開發者,您可以利用金鑰驗證在自己的伺服器上驗證您的應用請求的 ECDSA 金鑰確實位於安全硬體中。請注意,在您的應用中使用驗證意義不大;如果 Android OS 未被入侵併值得信賴,那麼您可以直接使用 6.0 中引入的 KeyInfo 類來確定金鑰是否處於安全硬體中。如果系統已被入侵,那麼該 API 與您在裝置上驗證金鑰認證的任何嘗試都是不可靠的。
請注意,金鑰認證與 SafetyNet 認證不同。它們的理念相同,不過認證的物件不同,來源也不同。金鑰庫金鑰認證旨在宣告加密金鑰位於安全硬體中並且具備指定的某些特性。SafetyNet 認證旨在宣告裝置是真實裝置(不是模擬器)並且裝置正在執行已知軟體。SafetyNet 在幕後也使用金鑰庫金鑰認證,因此,如果您想要了解裝置完整性,請使用這種認證。如果您想要確認您的金鑰位於安全硬體中,請使用金鑰認證。
如需瞭解詳細資訊和示例程式碼,請關注本公眾號並回覆 “金鑰”
瞭解我們的金鑰認證培訓文章。
檢視全文及文中連結,請點選文末“閱讀原文”。
推薦文章:
中文視訊首發
| Android 8.0 Oreo 推送通知的變化
相關文章
- ViewStub你真的瞭解嗎View
- 你真的瞭解mongoose嗎?Go
- 你真的瞭解 WebSocket 嗎?Web
- JavaScript 你真的瞭解this指向嗎JavaScript
- 你真的瞭解前端路由嗎?前端路由
- 你真的瞭解RPC嗎?RPC
- 你真的瞭解URLEncode嗎?
- 你真的瞭解“密碼”嗎?密碼
- 你真的瞭解nosql世界嗎?SQL
- 你真的瞭解深度學習嗎?深度學習
- 你真的瞭解 Cookie 和 Session 嗎?CookieSession
- 你真的瞭解 Cookie 和 Session 嗎CookieSession
- 你真的瞭解npm-scripts嗎?NPM
- 你真的瞭解 Session 和 Cookie 嗎?SessionCookie
- 你真的瞭解js運算子嗎JS
- 你真的瞭解HTTP快取嗎HTTP快取
- 你真的瞭解 React 生命週期嗎React
- 你真的瞭解Event Loop(事件環)嗎?OOP事件
- 你真的瞭解 OkHttp 快取控制嗎?HTTP快取
- AnyForWeb分享:畫素!你真的瞭解嗎?Web
- 你真的瞭解python嗎?這篇文章帶你快速瞭解!Python
- 最新的15個Android庫,你瞭解嗎?Android
- 你真的瞭解響應式佈局嗎?
- 注意!JS的結構你真的瞭解嗎?JS
- 你真的瞭解延時佇列嗎(一)佇列
- 靈魂拷問,你真的瞭解DNS嗎?DNS
- 【UI設計師】你真的瞭解色彩嗎?UI
- platform 模組 你真的瞭解你的計算機嗎?Platform計算機
- Android:四大架構的優缺點,你真的瞭解嗎?Android架構
- 你真的對 Linux 中的 Inode 瞭解嗎?Linux
- 你真的瞭解 Unicode 和 UTF-8 嗎?Unicode
- Python讀寫檔案你真的瞭解嗎?Python
- 面試官:你真的瞭解Redis分散式鎖嗎?面試Redis分散式
- stl中的sort函式,你真的瞭解嗎函式
- TCP/IP、HTTP、socket 這些,你真的瞭解嗎?TCPHTTP
- 你真的瞭解JS陣列的那些方法嗎?JS陣列
- 你真的瞭解 NDK 和 jni 的區別嗎
- C++的那些事:你真的瞭解引用嗎C++