修復不安全的加密編譯模式

開發人員請注意,如果您的應用程式含有不安全的加密編譯模式,請詳閱本文資訊。不安全的加密編譯模式是指由「靜態計算」的密鑰、鹽或初始化向量 (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 最佳做法不符您的需求,且您必須精確管理金鑰、初始化向量和鹽,那麼我們建議您遵循以下標準進行操作

  1. 密鑰:對稱密鑰必須是秘密且無法預測的。對於加密本地資料,開發人員應以安全性隨機加密的方式 (如使用 PBEKeySpecs 則透過使用者產生的資料) 來建立密鑰,並使用 AndroidKeystore 儲存這些密鑰。
  2. 初始化向量:初始化向量必須是多則訊息中獨一無二且無法預測的,但毋須保密。開發人員應以安全性隨機加密的方式建立初始化向量,並將初始化向量與相關密文一併儲存或傳輸。
  3. :鹽必須是多個雜湊值中獨一無二且無法預測的,但毋須保密。開發人員應以安全性隨機加密的方式建立鹽,並應將鹽與相關雜湊值一併儲存或傳輸。

後續步驟

  1. 按照上述醒目顯示的步驟更新您的應用程式。
  2. 登入 Play Console 並提交您應用程式的更新版本。
我們會重新審查您的應用程式。如未確實更正應用程式的問題,您仍會收到警告。審查程序可能需要數個小時才會完成。

我們很樂意提供協助

如有關於安全漏洞的技術問題,請前往 Stack Overflow 張貼問題並加上「android-security」標記。
 

這對您有幫助嗎?

我們應如何改進呢?
false
主選單
16908313346793919109
true
搜尋說明中心
true
true
true
true
true
5016068
false
false