Known-Plaintext-Attack
在實際加密的值旁邊儲存一個已知值(用於檢查)是安全的
我正在使用的加密的高級細節是:
- AndroidKeyStore 創建/儲存 RSA 密鑰
- 使用 RSA/ECB/PKCS1Padding 創建和包裝 AES 密鑰
- 加密的 AES 保存到磁碟。
- 數據使用 AES/GCM/NoPadding 加密並保存到磁碟。
- 每個加密操作都會從平台安全隨機數中生成一個新的初始化向量。這些也與其數據一起保存到磁碟。
使用的算法/轉換受平台限制。
AndroidKeyStore 存在忘記密鑰的已知問題,我想保存在首次執行時加密的已知“lorem ipsum”數據。該已知數據稍後將在初始化期間用於檢查密鑰的一致性並為系統提供適當的狀態。
所以我的問題是:將這個已知的硬編碼值儲存在真實值旁邊是否安全,或者我正在洩漏所有內容並讓某人輕鬆解密真實值?
是的,這樣做是安全的。畢竟,任何密碼都應該能夠抵禦已知的明文攻擊。
但是,如果您使用的是 RSA,那麼 RSA 解密常式將在 PKCS#1 v1.5 取消填充期間拋出異常,因此無需儲存“lorem ipsum”數據:填充已充當“lorem ipsum”數據。
如果您仍然以某種方式需要“lorem ipsum”進行對稱加密(以防 Android 也失去了 AES 密鑰),那麼您不妨使用“lorem ipsum”作為 GCM 算法的附加數據。此數據包含在身份驗證標籤中,但不包含在密文中。如果它是恆定的,那麼您根本不必包含它。
請注意,您可能希望使用 RSA-OAEP 或 RSA-KEM 而不是 PKCS#1 以避免與填充相關的攻擊(RSA-OAEP 應該直接在 Java / Android 中可用,因此建議使用,但請檢查
KeyStore
實現和確定的目標執行時)。