本文面向的是发布的应用中存在不安全加密模式的开发者。不安全加密模式是指使用静态计算的密钥、盐或初始化矢量 (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 最佳做法不适合您的用例,并且您需要明确地管理密钥、初始化矢量和盐,那么我们建议您遵循以下标准:
- 密钥:对称密钥必须不可预测并且保密。要加密本地数据,开发者应使用能够确保加密安全性的随机生成机制(如果使用 PBEKeySpecs,则通过用户生成的数据)构建密钥,并使用 AndroidKeystore 存储密钥。
- 初始化矢量:初始化矢量必须唯一且不可预测,但不必保密。开发者应使用能够确保加密安全性的随机生成机制构建初始化矢量,并将初始化矢量与相关联的密文一起存储或传输。
- 盐:盐必须唯一并且多个哈希使用的盐值都不可预测,但不必保密。开发者应使用能够确保加密安全性的随机生成机制构建盐,并将盐与相关联的哈希一起存储或传输。
后续步骤
- 按照上文中重点介绍的步骤更新应用。
- 登录您的 Play Console,然后提交应用的更新版本。