如何安全地存储Android KeyStore密码

时间:2017-01-17 07:13:13

标签: android security passwords keystore android-keystore

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

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

我的问题是:

  1. 在上面的场景中:攻击者是否能够读取我的密钥库文件或(在无根电话上)可能只有我的应用程序可以访问该文件,因此单独的密码是不够的?
  2. 处理KeyStore密码的最佳做法是什么?我环顾四周,但没有找到明确的答案如何处理。
  3. 编辑以进行清除:我不会谈论应用程序签名,而是将密码密钥存储在受密码保护的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 个答案:

答案 0 :(得分:6)

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

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

keyAlias yourKeyAlias  
keyPassword yourKeyPassword  
storeFile pathOfYourKeyStoreFile  
storePassword passwordOfYourKeyStoreFile

<强>摇篮
设置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构建文件中,你应该有buildTypes { ... }子句,其中包含debug { ... }release { ... } configs作为默认值。修改release配置,以便:

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

      signingConfig signingConfigs.config
    }
  }

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

答案 1 :(得分:2)

在Android应用程序(.apk文件)中保护密码是绝对不可能的。但你可以尝试通过以下方式保护它:

  • 模糊您的源代码。其他人将花费大量时间来找出用于保护信息的方法。
  • 模糊源代码中的所有字符串。所有明文字符串都将被隐藏,没有人能够轻易看到它。

你可以通过两种方式实现:

  1. 手动模糊所有字符串,然后使用Proguard进行模糊处理 源代码。
  2. 使用:Bg+ Anti Decompiler/Obfuscator。它是通过混淆,隐藏,伪造,检查......技术保护Android Java Source的新解决方案