在一个应用程序中,我使用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.config
在release { ... }
将允许每当您选择创建一个发布版本你自动登录你的APK,所有这些不存储在您的APK您的密钥库的密码.干杯!
建议不要在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.config
在release { ... }
将允许每当您选择创建一个发布版本你自动登录你的APK,所有这些不存储在您的APK您的密钥库的密码.干杯!