Ниже приведен код, который я использую на своем эмуляторе Android:
KeyPairGenerator keyGen = null;
keyGen = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore"); // store the key in the Android KeyStore for security purposes
keyGen.initialize(new KeyGenParameterSpec.Builder(
"key1",
KeyProperties.PURPOSE_SIGN)
.build()); // defaults to RSA 2048
KeyPair keyPair = keyGen.generateKeyPair();
KeyFactory factory = KeyFactory.getInstance(keyPair.getPrivate().getAlgorithm(), "AndroidKeyStore");
KeyInfo keyInfo = factory.getKeySpec(keyPair.getPrivate(), KeyInfo.class);
boolean secure = keyInfo.isInsideSecureHardware();
System.out.println("Is the private key backed in hardware: " + secure);
Это результаты, которые я получаю по разным версиям:
Уровень API 27: true
Уровень API 28: false
Уровень API 29: false
Почему возвращаемое значение isInsideSecureHardware
изменяется на разных уровнях API? Я бы подумал, что это будет полностью зависеть от оборудования, а не от уровня API, который работает на телефоне.