当前位置:  开发笔记 > Android > 正文

如何安全地存储Android KeyStore密码

如何解决《如何安全地存储AndroidKeyStore密码》经验,为你挑选了1个好方法。

在一个应用程序中,我使用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();

小智.. 6

建议不要在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构建文件中,你应该buildTypes { ... }包含默认包含debug { ... }release { ... }配置的子句.修改release配置,以便:

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

      signingConfig signingConfigs.config
    }
  }

定义signingConfig signingConfigs.configrelease { ... }将允许每当您选择创建一个发布版本你自动登录你的APK,所有这些不存储在您的APK您的密钥库的密码.干杯!



1> 小智..:

建议不要在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构建文件中,你应该buildTypes { ... }包含默认包含debug { ... }release { ... }配置的子句.修改release配置,以便:

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

      signingConfig signingConfigs.config
    }
  }

定义signingConfig signingConfigs.configrelease { ... }将允许每当您选择创建一个发布版本你自动登录你的APK,所有这些不存储在您的APK您的密钥库的密码.干杯!

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有