【发布时间】: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