開發人員請注意,如果您的應用程式含有不安全的加密編譯模式,請詳閱本文資訊。不安全的加密編譯模式是指由「靜態計算」的密鑰、鹽或初始化向量 (IV) 所產生的密文。如想找到不安全加密編譯模式的位置,請前往 Play Console 查看您的應用程式通知。
如何修正「不安全的加密編譯模式」問題
檢查您的應用程式是否具有靜態計算金鑰、初始化向量和/或用在加密作業中的鹽,並確保這些值的組成安全無虞。舉例來說,下列程式碼使用的就是可靜態計算的密鑰和初始化向量: // 管理中心快訊是指這個方法
public byte[] encryptionUtil(String key, String iv, byte[] plainText) {
Cipher cipher = Cipher.getInstance(“AES/GCM/NoPadding”);
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), “AES”);
GCMParameterSpec paramSpec = new GCMParameterSpec(256, iv.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, keySpec, paramSpec);
return cipher.doFinal(plainText);
}
// 以下為不安全的金鑰和初始化向量,應進行變更
byte[] cipherText = encryptionUtil(“abcdef...”, “010203040506”, plainText);
靜態計算值
「靜態計算」值是每次執行您應用程式時會產生的相同的值。他人可以從您的應用程式中擷取靜態計算的加密值,並用來攻擊應用程式中的加密資料。即使您在使用前先以複雜的方式重新編排金鑰、初始化向量和鹽,但只要每次執行程式的編排都相同,這個程序仍然是不安全的。
Android 最佳做法
建議您使用 Jetpack Security 進行對稱加密。如果您的應用程式會加密 API 金鑰、個人識別資訊 (PII) 或其他機密資料,則可使用 EncryptedSharedPreferences 安全地儲存這些資料,不必擔心密鑰、初始化向量和鹽的實作問題。如需更多最佳做法及範例,歡迎參閱這個網頁。如要將資料安全地傳輸至其他系統,開發人員應使用 TLS/SSL 以確保傳輸中的資料安全無虞。
Jetpack Security 利用 Google 開放原始碼專案 Tink 處理對稱驗證加密。如果您有低層級加密作業的進階用途需求,我們建議您直接使用 Tink。
如果上述 Android 最佳做法不符您的需求,且您必須精確管理金鑰、初始化向量和鹽,那麼我們建議您遵循以下標準進行操作:
- 密鑰:對稱密鑰必須是秘密且無法預測的。對於加密本地資料,開發人員應以安全性隨機加密的方式 (如使用 PBEKeySpecs 則透過使用者產生的資料) 來建立密鑰,並使用 AndroidKeystore 儲存這些密鑰。
- 初始化向量:初始化向量必須是多則訊息中獨一無二且無法預測的,但毋須保密。開發人員應以安全性隨機加密的方式建立初始化向量,並將初始化向量與相關密文一併儲存或傳輸。
- 鹽:鹽必須是多個雜湊值中獨一無二且無法預測的,但毋須保密。開發人員應以安全性隨機加密的方式建立鹽,並應將鹽與相關雜湊值一併儲存或傳輸。
後續步驟
- 按照上述醒目顯示的步驟更新您的應用程式。
- 登入 Play Console 並提交您應用程式的更新版本。