首页 文章

如何安全地存储Android KeyStore密码

提问于
浏览
3

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

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

我的问题是:

  • 在上面的场景中:攻击者是否能够读取我的密钥库文件或(在无根电话上)可能只有我的应用程序可以访问该文件,因此单独的密码是不够的?

  • 处理KeyStore密码的最佳做法是什么?我环顾四周,但没有找到一个明确的答案如何处理这个问题 .

编辑以进行清除:我不会谈论应用程序签名,而是将密码密钥存储在受密码保护的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 回答

  • 4

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

    PROPERTIES FILE
    如果您使用的是版本控制,请修改 .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构建文件中,你应该有 buildTypes { ... } 子句,它包含默认的 debug { ... }release { ... } 配置 . 修改 release 配置,以便:

    buildTypes {
        debug {
          *insert debug configs here*
        }
        release {
          *insert release configs here*
    
          signingConfig signingConfigs.config
        }
      }
    

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

  • 1

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

    • 模糊您的源代码 . 其他人将花费大量时间来找出用于保护信息的方法 .

    • 模糊源代码中的所有字符串 . 所有明文字符串都将被隐藏,没有人能够轻易看到它 .

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

    • 手动模糊所有字符串,然后使用Proguard混淆源代码 .

    • 使用:Bg+ Anti Decompiler/Obfuscator . 这是一种通过混淆,隐藏,伪造,检查......技术来保护Android Java Source的新解决方案

相关问题