如何安全存储Android密钥库密码

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

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

我的问题是:

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

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

当前代码示例:

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();

解决方案

建议不要将密码存储在您的APK中。当我们谈论密钥库密码时,就更多了。是的,攻击者能够而且将会找到读取密码的方法,因为这就是他们所做的。不计后果地阅读APK中包含的密码。假设您使用Gradle,有一种使用Gradle指定如何存储密钥库密码的方法。

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

keyAlias yourKeyAlias  
keyPassword yourKeyPassword  
storeFile pathOfYourKeyStoreFile  
storePassword passwordOfYourKeyStoreFile

Gradle
设置好keystore.properties文件后,通过在android { ... }子句之外定义一个属性变量来修改模块级别的Gradle构建文件,例如:

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

android { ... }  

android { ... }内,声明signingConfigs { ... }

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

  ...........  

}
最后,仍然在您的模块级别Gradle构建文件的android { ... }内部,您应该有buildTypes { ... }子句,其中包含debug { ... }release { ... }配置作为默认设置。修改release配置,以便:

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

      signingConfig signingConfigs.config
    }
  }
release { ... }中定义signingConfig signingConfigs.config将允许您在选择创建发布版本时自动签署APK,所有这些都不会将您的密钥库密码存储在APK中。干杯!

相关文章