在文件之間的混合密碼系統中重用對稱密鑰本質上是不安全的嗎?
這個問題源於一個 UX 問題,我希望使用者在打開移動應用程序時只輸入一次 PIN。以下是應用程序的一些屬性,以提供一些上下文。
- 使用者在帶有藍牙智能卡讀卡器的移動設備上
- 儲存在設備上的數據是 PII 數據,國家法規(瑞典)規定只能通過安全的 2 因素身份驗證訪問數據
- 我計劃對敏感數據使用混合密碼系統
- 對稱密鑰將用智能卡解密
- 我想儲存資訊以供離線使用,因此線上 web 應用程序的嵌入式 web 瀏覽器不會削減它。
- 會有多個文件需要加密,例如媒體都是單獨的文件。
鑑於這些先決條件,我計劃為每個應用安裝的每個唯一使用者定義一個對稱密鑰。
這意味著為單個使用者同步到該應用程序安裝的任何數據都將使用相同的對稱密鑰。這樣我想用相同的對稱密鑰解密與一個使用者相關的所有文件。我認為它類似於 OAuth2 令牌(但現在沒有更新部分)。
請幫助我評估此模型是否存在任何安全漏洞!
在混合密碼系統中重用對稱密鑰可能安全也可能不安全,具體取決於密碼系統。舉一個簡單的例子,假設一個系統被設計為使用一個一次性使用的對稱加密密鑰和 CTR 模式的密碼,現在它被擴展為這樣一種方式,對稱密鑰現在可以用於多個消息,但仍然與同一方。(如果協議每次都更改為與不同方共享對稱密鑰,這顯然會影響安全性。)如果密碼系統使用隨機初始計數器值,則可以多次使用同一密鑰而不會影響安全性。如果密碼系統使用初始計數器值 0,那麼使用一次性密鑰是完全可以的,但如果密鑰被重複使用,那將是災難性的。
使用在會話開始時解鎖的長期密鑰加密的數據是完全標準的。例如,全盤加密就是這樣做的——通常使用相同的密鑰來加密加密設備所有塊的所有連續版本。
將對稱密鑰儲存在智能卡中並在使用者輸入 PIN 時讓卡將其傳送到電腦(在您的情況下為電話)的基本思想是合理的。電腦應僅將密鑰保存在 RAM 中,您的應用程序應在延遲後擦除密鑰。延遲多長時間是使用者體驗和安全性之間的妥協,取決於數據的性質;您必須在使用者便利性與設備被盜風險之間取得平衡。
用不同的密鑰加密每個文件可能有價值,也可能沒有價值。出於性能和使用者體驗的原因,讓卡完成整個加密和解密可能是不可能的(卡必須在所有文件訪問期間都在場)。但是讓卡一次只釋放一個每個文件的密鑰可能有意義,也可能沒有意義。如果有理由對不同文件的訪問應遵循不同的規則(例如,您可能希望不同文件的密鑰具有不同的超時時間),您確實需要每個文件的密鑰。每個文件的密鑰還提供更好的保護以防止有限時間的妥協(例如,流氓應用程序可以從您的應用程序的記憶體中提取密鑰但不會將程式碼注入您的應用程序)。您可以通過兩種方式獲得每個文件的密鑰:或者有一個主密鑰,卡根據請求釋放,電腦進行密鑰推導;或者萬能鑰匙永遠不會離開卡,當訪問該文件時,電腦會要求卡派生每個文件的密鑰。
無論您選擇哪種算法,請確保正確使用它,特別是為每個文件(儲存在文件開頭)使用隨機 IV。請注意,如果文件更改,如果文件的新版本使用相同的密鑰加密,則必須使用新的隨機 IV。
您應該使用經過身份驗證的加密(例如 GCM),以防止電腦上的惡意應用程序嘗試解密不良數據的主動攻擊。請注意,這意味著文件必須作為一個整體進行解密(+身份驗證);您可能需要拆分大文件。另請注意,對文件進行身份驗證僅證明它是該文件的某個有效版本;它可能是舊版本,也可能是不同文件的有效內容,除非您驗證文件名與其內容之間的關係。
作為最後一點,現代主要移動平台包括可以儲存加密文件的受保護環境,對第三方應用程序提供一些保護,以及訪問所需的某種形式的使用者身份驗證(PIN 或指紋)(iPhone/iPad 上的鑰匙串,高結束 Android 手機和平板電腦)。這滿足了雙因素身份驗證的要求。雖然它不能很好地防止針對靜態密鑰的攻擊,但它可以更好地保護這裡的重大威脅,即設備上的流氓應用程序利用作業系統錯誤來提取密鑰,而它是正在使用。使用智能卡方法,關鍵就在應用程序的記憶體中;使用 keychain/keymaster 方法,密鑰保留在受保護的環境中,儘管解密的數據無論如何對惡意應用程序都是可見的。