当前位置: 首页 > 知识库问答 >
问题:

如何安全存储Android KeyStore密码

吴宝
2023-03-14

在一个应用程序中,我使用Android密钥库。我已经为整个密钥库和每个密码条目设置了密码。因为这些密码是字符串,所以它们存储在代码的字符串成员中。

显然,如果我想发布应用程序,这是不安全的,因为潜在的攻击者可以反编译apk并获取密码,因为它是硬编码在应用程序中的。

我的问题是:

  1. 在上面的场景中:攻击者是否能够读取我的密钥库文件,或者(在无根手机上)该文件是否只能由我的应用程序访问,因此仅密码是不够的?
  2. 处理密钥库密码的最佳做法是什么?我环顾四周,但没有找到如何处理这个问题的明确答案。

编辑以澄清:我不谈论应用程序签名,而是关于在Android KeyStore中存储密码保护的密钥。应用程序必须在运行时访问密码才能检索密钥条目。

当前代码的示例:

String keyStorePwd = "password1";
String keyEntryPwd = "password2";

FileInputStream fis = getApplicationContext().openFileInput("sms.keystore");
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());

ks.load(fis, keyStorePwd.toCharArray());

SecretKey key = (SecretKey) ks.getKey("aes_key_sms_notifier", keyEntryPwd.toCharArray());
fis.close();

共有2个答案

万俟嘉珍
2023-03-14

不可能制定绝对的解决方案来保护Android应用程序(. apk文件)中的密码。但您可以尝试通过以下方式保护它:

  • 混淆源代码。其他人需要花很多时间才能找到您用来保护信息的方法
  • 混淆源代码中的所有字符串。所有明文字符串都将被隐藏,没有人能轻易看到

你可以通过两种方式做到这一点:

  1. 手动混淆所有字符串,然后使用 Proguard 对源代码进行模糊处理。
  2. 用途:Bg反编译器/混淆器。这是一种通过混淆,隐藏,伪造,检查来保护Android Java源代码的新解决方案,...技术
尹光辉
2023-03-14

不建议在 APK 中存储密码。当我们谈论密钥库密码时,还有更多。是的,攻击者可以并且会找到读取密码的方法,因为这就是他们所做的。鲁莽地阅读APK中包含的密码。有一种方法可以使用 gradle 来指定如何存储密钥库密码,假设您使用 gradle。

PROPERTIES FILE
如果您使用版本控制,请修改您的. gitignore文件以排除keystore.properties,该文件将包含您的密码。然后将其推送到存储库中。这样做将防止共享项目中的其他开发人员知道密钥库详细信息。您现在可以在项目的根目录中创建实际的keystore.properties文件。该文件应包含以下内容:

keyAlias yourKeyAlias  
keyPassword yourKeyPassword  
storeFile pathOfYourKeyStoreFile  
storePassword passwordOfYourKeyStoreFile

GRADLE
设置< code>keystore.properties文件后,通过在< code>android {...}子句,例如:

def keystorePropertiesFile= rootProject.file("keystore.properties")  
def keystoreProperties = new Properties()  
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))  

android { ... }  

在< code>android {...},声明< code >签名配置{...}以便:

android {
  signingConfigs {
    config {
      keyAlias keystoreProperties['keyAlias']
      keyPassword keystoreProperties['keyPassword']
      storeFile file(keystoreProperties['storeFile'])
      storePassword keystoreProperties['storePassword']
    }
  }

  ...........  

}

最后,仍然在模块级gradle构建文件的android{…}内部,您应该有buildTypes{…}子句,其中包含debug{…}释放{…}配置作为默认配置。修改发布配置如下:

  buildTypes {
    debug {
      *insert debug configs here*
    }
    release {
      *insert release configs here*

      signingConfig signingConfigs.config
    }
  }

定义签名在发布 { ... } 中定义签名Configs.config 将允许您在选择创建发布版本时自动对 APK 进行签名,所有这些操作都无需在 APK 中存储密钥库密码。干杯!

 类似资料:
  • 我在工作中被要求保护保存在Mysql数据库中的敏感数据。这个数据库包含几个表,其中一个表中的关键数据只能使用Django中的API来访问。对于这个API,只有一定数量的人可以访问它,因此他们将是唯一能够访问这个表中的数据的人。 因此,目前的问题是每个人都可以访问数据库和该表,因此我们决定使用AES在AES_ENCRYPT()和AES_DECRYPT()函数的帮助下加密该表中的所有数据(根据http

  • 问题内容: 我在工作场所使用Git,并且公司政策不允许我以不安全的方式存储密码。有没有比将密码存储到Git服务器更好的选择了? PS无法使用密钥验证,因为我们的服务器不允许使用密钥验证。 问题答案: 不是很安全;如文档中所说: 使用此帮助程序会将密码未加密地存储在磁盘上,仅受文件系统权限保护 〜/ .git-credentials文件将设置其文件系统权限,以防止系统上的其他用户读取它,但不会被加密

  • 问题内容: 我有一个Java属性对象,其中包含Web服务的身份验证信息。我需要对这些数据进行加密,但是我不知道该将加密密钥存储在何处才能保持安全。 关于加密和以安全方式检索数据的最佳实践是什么? 使用密钥库有什么好处吗? 问题答案: 您的问题很普遍。在Linux中,用户密码存储在纯文本文件中。尽管只存储了密码哈希,但是如果攻击者可以访问该文件,则使用脱机词典攻击可以很快发现一些密码。在这种情况下,

  • 在flutter应用程序中存储key.jks文件对于flutter应用程序发布是安全的吗? 存储库密码、keyPassword、keyAlias 我的key.properties文件:

  • 问题内容: 我想知道如何在Android中安全存储 加密密钥 吗?保护加密和秘密密钥的最佳方案是什么? 问题答案: 根据您的评论,您需要使用适用于当前Android版本和旧Android版本的本地密钥对数据进行加密 Android Keystore 旨在生成和保护您的密钥。但是它不适用于18级以下的API级别,并且在API 23级之前有一些限制。 您将需要一个随机对称加密密钥,例如AES。AES密

  • 我在工作场所使用Git,公司政策不允许我以不安全的方式存储密码。有没有比使用