Android Keystore,密钥的安全值

时间:2013-12-09 08:41:01

标签: android security encryption keystore

我目前正在调查使用Android 4.3中引入的安全/改进的密钥库。

我想在此密钥库中存储加密密钥,此密钥用于加密sqllite数据库以及我的共享首选项中包含的值。

当我查看SDK中的KeyStore示例时,我看到以下内容:

public static final String ALIAS = "my_key"

如果有人能够反编译我的代码,他们就能看到明文别名(=从密钥库中检索加密密钥的密钥),因此他们可以获得对我的加密密钥的引用。我怎样才能安全地管理我的ALIAS?或者我错过了这一点?

2 个答案:

答案 0 :(得分:7)

以下答案适用于4.3+。 KeyStore& amp;此版本上的KeyChain类。有关详细信息,请参阅here

Keystore访问权限受UID限制 - 您的应用在安装时会分配UID。

这可以防止其他应用/进程访问您的密钥对/私钥。密钥库deamon将强制执行此操作。

这可能需要设备引脚进行额外加密。见http://developer.android.com/reference/android/security/KeyPairGeneratorSpec.Builder.html#setEncryptionRequired()

使用软件/硬件密钥库的重点是绕过您描述的情况 - 应用程序中的任何硬编码数据都可以在反编译中读取,因此不安全。

@Duncans的回答让你觉得你需要保持密码。我建议您使用密钥库生成密钥对,然后使用它来加密可用于加密任何所需内容的AES密钥(比使用RSA密钥快得多)

您可以使用您的硬件/ sortware密钥库支持的私钥,如keyStore.getEntry(alias, null);,但不传递任何密码。

有关此

的一个好例子,请参阅SecretKeyWrapper.java

答案 1 :(得分:1)

别名不是敏感信息。每个密钥库都与一个密码相关联,每个密钥也有自己的(可选)密码。这些是必须保持安全的价值观。

如果没有密码,攻击者即使知道别名也无法读取您的密钥材料。