Encryption

使用數字簽名作為密鑰導出材料的安全性

  • July 16, 2016

我希望我的 iOS 應用程序中的所有密鑰都依賴 Secure Enclave 來確保安全,因為 iOS 鑰匙串在越獄設備上變得不安全。目前,Secure Enclave 目前僅支持生成/儲存 EC 和 RSA 密鑰。我正在考慮使用以下設計間接使用 Secure Enclave 來儲存對稱加密密鑰,但想驗證其安全性:

  1. 在應用程序初始化時,在 Secure Enclave 中生成一個非對稱 EC 密鑰 K。
  2. 使用它對設備 UUID(或其他常量)進行簽名,產生簽名 S。
  3. 導出加密密鑰 E = KDF(S)
  4. 使用加密密鑰 E 加密本地數據庫中的項目。(E 本身並不儲存在任何地方。)
  5. 在任何後續應用程序啟動時,重新派生 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 支持。

引用自:https://crypto.stackexchange.com/questions/37687