针对不安全加密问题的解决方法

本文面向的是发布的应用中存在不安全加密模式的开发者。不安全加密模式是指使用静态计算的密钥、盐或初始化矢量 (IV) 生成密文。您可以在 Play Console 中查看针对相应应用的通知,了解不安全加密所在的位置。

如何解决“不安全的加密模式”提醒的问题

检查您的应用,找到在加密操作中使用的静态计算秘钥、初始化矢量和/或盐,确保这些值以安全的方式来构建。例如,以下代码使用了可静态计算的密钥和可静态计算的初始化矢量:

   // 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) 或其他敏感数据进行加密处理,可以使用 EncryptedDharedPreferences 安全地存储此类数据,而无需担心密钥、初始化矢量和盐的实现问题。有关进一步的最佳做法和示例,请访问此页面。为了安全地向其他系统传输数据,开发者应使用 TLS/SSL 确保传输数据的安全。

Jetpack Security 利用 Google 开源项目 Tink 来处理对称身份验证加密。对于涉及较低级别加密操作的高级用例,我们建议直接使用 Tink。

如果上述 Android 最佳做法不适合您的用例,并且您需要明确地管理密钥、初始化矢量和盐,那么我们建议您遵循以下标准:

  1. 密钥:对称密钥必须不可预测并且保密。要加密本地数据,开发者应使用能够确保加密安全性的随机生成机制(如果使用 PBEKeySpecs,则通过用户生成的数据)构建密钥,并使用 AndroidKeystore 存储密钥。
  2. 初始化矢量:初始化矢量必须唯一且不可预测,但不必保密。开发者应使用能够确保加密安全性的随机生成机制构建初始化矢量,并将初始化矢量与相关联的密文一起存储或传输。
  3. :盐必须唯一并且多个哈希使用的盐值都不可预测,但不必保密。开发者应使用能够确保加密安全性的随机生成机制构建盐,并将盐与相关联的哈希一起存储或传输。

后续步骤

  1. 按照上文中重点介绍的步骤更新应用。
  2. 登录您的 Play Console,然后提交应用的更新版本。
我们会重新审核您的应用。如果该应用未正确更新,您仍然会看到警告。审核过程可能需要几个小时才能完成。

我们随时为您提供帮助

如果您有关于此漏洞的技术问题,可以在 Stack Overflow 上发帖咨询(使用“android-security”标签)。
 

该内容对您有帮助吗?

您有什么改进建议?
false
主菜单
12493170522581987229
true
搜索支持中心
true
true
true
true
true
5016068
false
false