在Android中,如何确保将私钥存储在安全硬件

时间:2016-07-04 07:04:04

标签: android security private-key android-keystore

KeyInfo的isInsideSecureHardware-method的返回值似乎取决于设备型号,操作系统版本以及其他一些随机因素。

例如,当使用索尼xperia z5 compact与旧的os版本时,isInsideSecureHardware()可能会返回true一段时间,然后突然开始为同一私钥返回false。 使用最新的操作系统版本(32.2.A.0.224),它似乎只返回false。 华为Nexus 6P始终如一。

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

这是我目前的代码:

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密钥库:主密钥管理设备无法生成密钥,回退到SW。

1 个答案:

答案 0 :(得分:3)

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

看看这款手机的规格,它最初是在Lollipop上发布的。那是在官方的Marshmallow指纹API /硬件规格和制造商做自己的事情之前。本文提到了您正在使用的设备(http://blog.elcomsoft.com/2016/06/fingerprint-unlock-security-ios-vs-google-android-part-ii/)。我想知道你回来的真实价值是否不正确,然后由于你的O / S升级它修复了逻辑(或打破了吗?)。您提及的O / S升级版本包含" 2016年4月1日Google安全补丁"

我有几个问题:

  1. isUserAuthenticationRequirementEnforcedBySecureHardware()现在在您的设备上返回什么?价值是否一致?如果它是假的,可能会告诉您指纹识别器不被认为是安全的(或者存在操作系统缺陷)

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