【问题标题】:Android Keystore, secure value of keyAndroid Keystore,密钥的安全值
【发布时间】:2013-12-09 08:41:01
【问题描述】:

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

我想在这个密钥库中存储一个加密密钥,这个密钥用于加密一个 sqllite 数据库和我的共享首选项中包含的值。

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

public static final String ALIAS = "my_key"

如果有人能够反编译我的代码,他们将能够看到明文别名(= 从密钥库中检索加密密钥的密钥),因此他们将能够获得对我的加密密钥的引用。如何安全地管理我的 ALIAS?还是我错过了这里的重点?

【问题讨论】:

    标签: android security encryption keystore


    【解决方案1】:

    以下答案适用于 4.3+。此版本对 KeyStore 和 KeyChain 类进行了重大更改。请参阅here 了解更多信息

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

    这是阻止其他应用程序/进程访问您的密钥对/私钥的原因。密钥库守护程序将强制执行此操作。

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

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

    @Duncans 的回答使您似乎需要保留密码。我建议您使用密钥库生成一个密钥对,然后使用它来加密一个 AES 密钥,您可以使用它来加密您想要的任何内容(比使用 RSA 密钥快得多)

    您可以使用您的硬件/分类软件密钥库支持的私钥,例如 keyStore.getEntry(alias, null);,而无需传递任何类型的密码。

    请参阅SecretKeyWrapper.java 了解一个很好的例子

    【讨论】:

    • 那么对于像ICS这样的4.3以下的Android版本的解决方案是什么?
    • 好吧,问题是关于 4.3 中引入的 KeyStore,因此
    【解决方案2】:

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

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

    【讨论】:

    • 能否指出哪些是密码?我目前正在查看示例中的 KeyStoreHelper.java。我可以看到有一个从 KeyPairGenerator 生成的 KeyPair 对象。这个对象会包含私钥和公钥吗?攻击者是否有可能重新打包我的代码并获得对这些密钥的访问权限?
    • @user2987274 密码与loadgetKeysetKeyEntry 方法中的KeyStore 类一起使用。在将密钥存储在密钥库中之前,密钥没有关联的密码。因此,一个新生成的 KeyPair 对象没有密码,除非您将其保存在密钥库中。
    • 只是为了确定。会反编译我的代码并获得对 ALIAS 的引用的人将无法重新打包代码并获得对 KeyPair 的引用,因此它没有被持久化?还是有其他东西阻止该人获得对正确密钥对的引用?
    • @user2987274 如果您不保留您的密钥对,那么一旦您的应用程序停止运行,它就不会存在。如果你坚持它,你选择一个密码,这将保护密钥。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多