李陽天
Android的密鑰庫已經(jīng)推出很多年了,它為應用開發(fā)者提供了一種使用加密密鑰進行身份驗證和加密的方式。密鑰庫將密鑰資料存放在應用的進程空間之外,因此,密鑰資料不會在可能受到網(wǎng)絡釣魚攻擊的情形下被應用意外透露給用戶,不會通過其他某種渠道泄漏,也不會在應用遭到入侵時陷入危險之中。
許多設備也在安全硬件中為密鑰庫密鑰提供基于硬件的安全機制,這種機制將密鑰資料完全存儲在Android系統(tǒng)之外,因此即使Linux內(nèi)核遭受入侵,密鑰資料也不會泄漏。在絕大多數(shù)Android設備中,安全硬件都是主CPU的一種特殊模式,其通過硬件與Linux內(nèi)核及Android用戶空間強制隔離。有些設備還使用單獨的安全微處理器。
Android提供的API可以讓應用確定給定密鑰庫密鑰是否處于安全硬件中,但是如果操作系統(tǒng)受到入侵,這些API將變得不可靠。密鑰認證讓設備的安全硬件可以驗證某個非對稱密鑰是否處于安全硬件中,從而在Android OS遭受入侵時為密鑰提供保護。
密鑰庫最初在Android 4.0中引入,密鑰采用用戶的密碼進行加密。Android 4.1添加了使用設備安全硬件的基礎架構。
在Android 6.0之前,密鑰庫僅支持RSA和ECDSA。在Android 6.0中,密鑰庫得到顯著增強,增加了對AES和HMAC的支持。此外,加密運算的其他關鍵要素(例如RSA補位和AES區(qū)塊鏈接模式)也移入安全硬件中。
在Android 6.0中,密鑰庫還能夠限制特定密鑰的使用方式??梢詰玫淖钣杏孟拗剖怯脩羯矸蒡炞C綁定。這種限制允許將密鑰的使用“綁定”到用戶密碼(他們的PIN碼、圖案或口令)或者指紋。對于密碼身份驗證綁定,應用開發(fā)者可以指定一個超時(以秒為單位)。如果自用戶上次輸入密碼以來所經(jīng)歷的時間已超過指定時間,安全硬件將拒絕要求使用密鑰的任何請求。指紋綁定密鑰在每次使用密鑰時都會要求新的用戶身份驗證。
還可以向Android 6.0+密鑰應用其他更多技術限制。特別是,在創(chuàng)建或?qū)朊荑€時,需要指定密鑰可用于哪些加密目的(加密、解密、簽名或驗證),為初始化向量或隨機數(shù)指定補位與分組加密模式、摘要和熵源以及加密運算的其他詳細信息。由于指定的信息以加密方式永久綁定到密鑰資料上,密鑰庫將不允許以任何其他方式使用此密鑰。因此,已經(jīng)獲取應用或系統(tǒng)控制權限的攻擊者無法濫用密鑰。為了幫助防止攻擊,開發(fā)者應為給定密鑰指定盡可能窄的用戶范圍。
Android 7.0中引入了Android密鑰庫最重要的變更之一。預裝Android 7.0+并帶有安全鎖定屏幕的新發(fā)布設備必須具有安全硬件,并支持基于硬件的密碼身份驗證和密鑰庫密鑰。在Android 7.0之前,安全硬件支持比較分散,不過在未來幾年,這項功能將逐漸統(tǒng)一。
在Android 8.0中,密鑰認證已成為預裝Google Play的所有新設備的強制選項。
為何使用密鑰認證?假設您正在開發(fā)一款應用,該應用讓銀行客戶可以訪問其銀行余額、交易歷史記錄和賬單支付系統(tǒng)。安全性至關重要,您肯定不希望撿到用戶電話的任何人都能訪問用戶的銀行賬戶。一種應對方式是使用用戶的網(wǎng)站密碼。但是這種方式對用戶來說通常不方便,因為網(wǎng)站經(jīng)常需要復雜的長密碼,在小型觸摸屏上輸入這類密碼不是很方便。
借助Android密鑰庫,您可以生成一個非對稱的身份驗證密鑰(例如256位ECDSA密鑰),讓每位用戶使用他們的復雜網(wǎng)絡密碼登錄一次,然后在銀行的客戶賬戶數(shù)據(jù)庫中注冊公鑰。在用戶每次打開應用時,您都可以使用該ECDSA密鑰執(zhí)行一次質(zhì)詢,響應身份驗證協(xié)議。而且,如果您進行密鑰身份驗證綁定,用戶在每次打開應用時還可以使用他們的鎖定屏幕密碼或指紋進行身份驗證。這樣一來,他們可以在自己的電話上使用更簡單、更方便的身份驗證機制。
如果攻擊者入侵Android并嘗試提取密鑰,他們可能會無功而返,因為密鑰儲存在安全硬件中。
作為一名應用開發(fā)者,您可以利用密鑰驗證在自己的服務器上驗證您的應用請求的ECDSA密鑰確實位于安全硬件中。請注意,在您的應用中使用驗證意義不大;如果Android OS未被入侵并值得信賴,那么您可以直接使用6.0中引入的KeyInfo類來確定密鑰是否處于安全硬件中。如果系統(tǒng)已被入侵,那么該API與您在設備上驗證密鑰認證的任何嘗試都是不可靠的。
請注意,密鑰認證與SafetyNet認證不同。它們的理念相同,不過認證的對象不同,來源也不同。密鑰庫密鑰認證旨在聲明加密密鑰位于安全硬件中并且具備指定的某些特性。SafetyNet認證旨在聲明設備是真實設備(不是模擬器)并且設備正在運行已知軟件。SafetyNet在幕后也使用密鑰庫密鑰認證,因此,如果您想要了解設備完整性,請使用這種認證。如果您想要確認您的密鑰位于安全硬件中,請使用密鑰認證。