【问题标题】:How to store hardcoded encryption master key in android?如何在android中存储硬编码的加密主密钥?
【发布时间】:2021-12-12 14:42:04
【问题描述】:
我正在构建一个使用 Room 的应用程序,我想使用 SQLCipher 加密数据库,这需要一个主密钥来加密/解密数据库。我不想从用户那里获取主密钥,我想使用 1 个主密钥并将其存储在设备上,但据我所知,对密钥进行硬编码并不安全。所以我想要一种方法将密钥安全地存储在应用程序上,以便与 SQLCipher 一起使用。
【问题讨论】:
-
This sample project 演示生成密码短语,然后将其存储在使用基于KeyStore 的加密密钥(通过androidx.security 及其EncryptedFile 类)加密的文件中。
标签:
android
encryption
key
android-room
sqlcipher
【解决方案1】:
您可以使用此library 来使用 android 密钥库系统保护您的数据。
您可以在您的应用程序中生成密钥:
String keyAlias = BuildConfig.APPLICATION_ID;
// Create and save key
Store store = new Store(FieldForceApplication.getContext());
if (!store.hasKey(keyAlias)) {
SecretKey key = store.generateSymmetricKey(keyAlias, null);
}
然后使用keyAlias(在我的情况下为applicationId)获取密钥,您可以设置任何字符串。
SecretKey key = store.getSymmetricKey(keyAlias, null);
获取密钥后,您可以将数据加密或解密为:
Crypto crypto = new Crypto(Options.TRANSFORMATION_SYMMETRIC);
String encryptedData = crypto.encrypt(rawText, key);
String decryptedData = crypto.decrypt(rawText, key);