使用數字簽名作為密鑰導出材料的安全性
我希望我的 iOS 應用程序中的所有密鑰都依賴 Secure Enclave 來確保安全,因為 iOS 鑰匙串在越獄設備上變得不安全。目前,Secure Enclave 目前僅支持生成/儲存 EC 和 RSA 密鑰。我正在考慮使用以下設計間接使用 Secure Enclave 來儲存對稱加密密鑰,但想驗證其安全性:
- 在應用程序初始化時,在 Secure Enclave 中生成一個非對稱 EC 密鑰 K。
- 使用它對設備 UUID(或其他常量)進行簽名,產生簽名 S。
- 導出加密密鑰 E = KDF(S)
- 使用加密密鑰 E 加密本地數據庫中的項目。(E 本身並不儲存在任何地方。)
- 在任何後續應用程序啟動時,重新派生 S 和 E 並使用 E 解密本地數據庫。
編輯:正如@zaph 指出的那樣,安全飛地保護整個鑰匙串。區別在於,有些密鑰可以在 Secure Enclave 中生成(曲線 p256 EC 密鑰和 RSA 密鑰),有些則不能。那些可以享受更高級別安全性的人,因為他們的私鑰無法從 Secure Enclave 中導出。我有興趣利用這些密鑰來間接保護其他密鑰/數據。
我很抱歉,但很可能這不起作用。
原因當然是 ECDSA 簽名通常是完全隨機的,這意味著在私鑰和最終簽名之間引入了隨機性。如果您正在查看ECDSA 規範,則相關值通常稱為ķ $ k $ 。
您更需要的是 RSA 加密/解密密鑰對或 ECDH 密鑰對。在這種情況下,您只需將加密密鑰儲存為文件或其他內容,並讓安全飛地在每次啟動時對其進行解密並將密鑰保存在 RAM 中。缺點當然是如果攻擊者可以從記憶體中提取它,那麼這個應用程序的安全性就會被搞砸。如果您有一個靜態 ECDH 密鑰對,您只需儲存一個公共 ECDH 共享並每次靜態派生密鑰並按照建議使用它。
但是,如果您必須使用簽名,則需要找到飛地提供的確定性簽名,並按照您的問題中的建議使用它。
如果它遵循任何確定性 ECDSA 標準(如RFC 6979 ),則可以包括 ECDSA ,並且還可以包括確定性 RSA 簽名(例如,通常是較舊的簽名標準)。
底線:只要您在直接依賴於硬體支持的密鑰(以確定性方式)的密鑰派生中使用一些(中間)值,這很可能是安全的。
Android 的 FDE 設置中給出瞭如何不進行此類推導的範例(實際上,好的推導的反例是 iOS)
鑰匙串已移至 Secure Enclave,Apple WWDC 2015 Session 766成績單指出:
“我們還將 KeyStore 組件從核心移到了 Secure Enclave 中,它是控制 Keychain 項周圍的加密和數據保護的組件。”
因此,如果設備存在 Secure Enclave 並且 iOS 版本為 9.0 或更高版本,則對稱和非對稱密鑰現在都在 Secure Enclave 中。
無需執行技巧即可獲得對對稱密鑰的 Secure Enclave 支持。