【问题标题】:In Android, how to ensure that Private Key is stored inside secure hardware在 Android 中,如何确保私钥存储在安全硬件中
【发布时间】:2016-09-29 18:31:32
【问题描述】:

KeyInfo 的 isInsideSecureHardware 方法的返回值似乎取决于设备型号、操作系统版本和其他一些随机因素。

例如,当使用带有旧操作系统版本的 Sony xperia z5 compact 时,isInsideSecureHardware() 可能会在一段时间内返回 true,然后突然开始为同一个私钥返回 false。 使用最新的操作系统版本(32.2.A.0.224),它似乎只返回假。 华为 Nexus 6P 总是返回 true。

有没有办法确保密钥存储在安全硬件中?

这是我当前的代码:

KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore");
keyPairGenerator.initialize(new KeyGenParameterSpec.Builder(KEY_NAME, KeyProperties.PURPOSE_DECRYPT | KeyProperties.PURPOSE_ENCRYPT)
                                    .setUserAuthenticationRequired(true)
                                    .setBlockModes(KeyProperties.BLOCK_MODE_ECB)
                                    .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)
                                    .build());
KeyPair keyPair = keyPairGenerator.generateKeyPair();
// Check that private key is inside secure hardware
KeyFactory factory = KeyFactory.getInstance(key.getAlgorithm(), "AndroidKeyStore");
KeyInfo keyInfo = factory.getKeySpec(key, KeyInfo.class);
boolean secure = keyInfo.isInsideSecureHardware(); //  this usually returns false

谢谢!

编辑: 在索尼支持论坛中有一个关于相同问题的主题: https://talk.sonymobile.com/t5/Android-development/hardware-backed-keystore/td-p/1154124

有人提到将以下警告打印到日志中:

W keystore:主 keymaster 设备无法生成密钥,退回到 SW。

【问题讨论】:

    标签: android security private-key android-keystore


    【解决方案1】:

    根据 Android API,验证它的唯一方法是首先创建密钥,然后查看信息以确保它是硬件支持的。

    查看手机的规格,它最初是在 Lollipop 上发布的。那是在官方 Marshmallow Fingerprint API/硬件规范和制造商做自己的事情之前。本文特别提到了您正在使用的设备 (http://blog.elcomsoft.com/2016/06/fingerprint-unlock-security-ios-vs-google-android-part-ii/)。我想知道您返回的真实值是否不正确,然后由于您的操作系统升级,它修复了逻辑(或破坏了它?)。您提到的操作系统升级版本包含“2016 年 4 月 1 日谷歌安全补丁”

    我有几个问题:

    1. isUserAuthenticationRequirementEnforcedBySecureHardware() 现在在您的设备上返回什么?值是否一致?如果它是假的,可以告诉您指纹读取器不安全(或存在 O/S 缺陷)

    2. 旧操作系统版本到底是什么意思?棒糖?您是否尝试过重置为出厂默认设置?

    【讨论】:

    • 请,当您想要求澄清时,不要写问题的答案。评论更好。
    • 嗨,很抱歉这么久才回答。 isUserAuthenticationRequirementEnforcedBySecureHardware() 在当前版本中返回 false。似乎是一致的。旧版本是 32.1.A.1.185。在该版本中,isUserAuthenticationRequirementEnforcedBySecureHardware() 返回 true。恢复出厂设置并不能解决问题。关于指纹扫描仪:当我将 UserAuthenticationRequired 设置为 false 时,同样的问题仍然存在。所以不再有任何与指纹扫描相关的东西。
    • @payala 看来作者提出这些问题,是为了以更恰当的方式回答原问题。此外,这个答案确实包含一些对我有帮助的好指针,例如“根据 Android API,验证它的唯一方法是首先创建密钥,然后查看信息以确保它是硬件支持的."
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 2015-11-24
    • 2018-03-16
    • 2013-05-30
    • 1970-01-01
    相关资源
    最近更新 更多