【发布时间】:2021-01-05 06:25:36
【问题描述】:
目前我们将字符串加密为:
import android.util.Base64;
import java.security.Key;
import java.util.Arrays;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class Cipher {
private static final String TEXT_ENCODING_TYPE = "UTF-8";
private static final String ALGO = "AES";
private static final String TYPE = ALGO + "/CBC/PKCS5Padding";
private static final String KEY = "MY_STATIC_KEY";
private static final String IV = "MY_STATIC_VECTOR";
private static final String IV_PADDING = " ";
public static String encrypt(String data) {
try {
if (!data.isEmpty()) {
javax.crypto.Cipher cipher = javax.crypto.Cipher.getInstance(TYPE);
cipher.init(javax.crypto.Cipher.ENCRYPT_MODE, getKey(), getIV());
return Base64.encodeToString(cipher.doFinal((IV_PADDING + data).getBytes()), Base64.NO_WRAP).trim();
} else {
return data;
}
} catch (Exception e) {
return data;
}
}
return new String(cipher.doFinal(data)).trim();
} else {
return encryptedData;
}
} catch (Exception e) {
LogUtils.log(e, Cipher.class);
return encryptedData;
}
}
private static Key getKey() throws Exception {
return new SecretKeySpec(KEY.getBytes(TEXT_ENCODING_TYPE), ALGO);
}
private static IvParameterSpec getIV() throws Exception {
return new IvParameterSpec(IV.getBytes(TEXT_ENCODING_TYPE));
}
private static IvParameterSpec getIV(byte[] iv) {
return new IvParameterSpec(iv);
}
}
但我们已收到来自 Google Play 管理中心的安全警报:
您的应用包含不安全的加密模式。
然后我们被重定向到这个链接:Remediation for Unsafe Cryptographic Encryption。 但是,此链接建议使用 Jetpack Security 包,其中我找不到如何加密字符串并为我们的每个服务器请求生成安全的 KEY 和 IV。
我访问过的所有示例和链接都指向将您的敏感数据保存到加密文件和 SharedPreferences。
那么,我现在该怎么办?我是否必须找到也可以在服务器端(Java)解码的安全密钥生成机制并将该密钥保存在 Secured SharedPreferences 中? Jetpack Security 包仍处于 Beta 模式。
打开以获取更多说明。
【问题讨论】:
-
我认为 Jetpack Security 更倾向于加密文件或通过提供加密存储来“保护” SharedPreferences。不过,对于您的用例,我不确定是否可以开箱即用(使用 Jetpack Sec.)。话虽这么说,我不认为将字符串存储在加密文件中是一个坏主意,您可以稍后将其删除,使用临时存储,并在您想要读取它时再次打开它(如果您想要加密的“字节" 你总是可以正常读取文件...这会是你使用它的问题吗?
-
好吧!我同意 Jetpack 更倾向于加密文件,但这里的问题是 KEY 和 IV 始终是静态的,导致每次都生成相同的密钥。不过这太令人困惑了。
-
看看我的回答,或许对你有帮助。我必须详细查看您的问题,看看是否有更好的方法。我对 Jetpack 安全性不是超级有经验,我只是在回答时使用了它。祝你好运!
-
我没有找到使用 Jetpack Security 加密字符串的方法,但我写了一个小类,使用
EncryptedFile和EncryptedSharedPreferences的相同逻辑来加密、解密、签名和验证 @987654329 @s(可以与字符串一起使用):stackoverflow.com/a/69957937/293878
标签: android encryption cryptography android-jetpack android-jetpack-security