如何在android中存储硬编码的加密主密钥?

Posted

技术标签:

【中文标题】如何在android中存储硬编码的加密主密钥?【英文标题】:How to store hardcoded encryption master key in android? 【发布时间】:2021-12-12 14:42:04 【问题描述】:

我正在构建一个使用 Room 的应用程序,我想使用 SQLCipher 加密数据库,这需要一个主密钥来加密/解密数据库。我不想从用户那里获取主密钥,我想使用 1 个主密钥并将其存储在设备上,但据我所知,对密钥进行硬编码并不安全。所以我想要一种方法将密钥安全地存储在应用程序上,以便与 SQLCipher 一起使用。

【问题讨论】:

This sample project 演示生成密码短语,然后将其存储在使用基于KeyStore 的加密密钥(通过androidx.security 及其EncryptedFile 类)加密的文件中。 【参考方案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);

【讨论】:

以上是关于如何在android中存储硬编码的加密主密钥?的主要内容,如果未能解决你的问题,请参考以下文章

Android安全开发之浅谈密钥硬编码

如何在android studio中伪装或加密gmail发件人的硬编码密码

无需硬编码访问密钥即可从 android 应用程序访问 AWS S3

在 .NET C# 中存储加密密钥的最佳方式

DPAPI 密钥存储和恢复

如何将密码加密到密钥表文件中?