Android: проверьте, находится ли ключ в безопасном оборудовании

Для своего приложения я создаю ключ AES и хочу проверить, хранится ли указанный ключ в безопасном оборудовании. Я погуглил и нашел пример для RSA, но решил, что это не имеет значения. Ниже приведен пример RSA, который я нашел:

final KeyGenerator keyGenerator = KeyGenerator
        .getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");

final KeyGenParameterSpec keyGenParameterSpec = new KeyGenParameterSpec.Builder("key_alias",
        KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
        .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
        .build();

keyGenerator.init(keyGenParameterSpec);
final SecretKey secretKey = keyGenerator.generateKey();

final Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);

KeyFactory keyFactory = KeyFactory.getInstance(secretKey.getAlgorithm(), "AndroidKeyStore");
KeyInfo keyInfo = keyFactory.getKeySpec(secretKey, KeyInfo.class);
keyInfo.isInsideSecureHardware();

Однако самая первая строка возвращает исключение no such algorithm: AES for provider AndroidKeyStore. Но разве нельзя также проверить, находится ли ключ AES внутри защищенного оборудования для AES?

Теоретически я мог бы использовать асимметричное шифрование, так как это всего лишь небольшой фрагмент данных, которые я хочу зашифровать/расшифровать, но я все же предпочел бы использовать симметричное шифрование.

У вас есть идея?

Изменить: добавлены дополнительные детали реализации.


person Alex    schedule 03.09.2020    source источник
comment
Привет, Алекс. Вы пробовали AndroidKeyStoreBCWorkaround в качестве второго аргумента для getInstance? Кроме того, каково точное значение secretKey.getAlgorithm()?   -  person Elletlar    schedule 03.09.2020
comment
Я хочу использовать ключ AES/GCM/NoPadding. Интересно, что AndroidKeyStoreBCWorkaround вызывает исключение при генерации ключа.   -  person Alex    schedule 03.09.2020
comment
Этот пост содержит более подробную информацию об обходном пути Google: Исключение AndroidKeystore NoSuchAlgorithm   -  person Elletlar    schedule 03.09.2020
comment
Спасибо, но у меня все еще есть проблемы с обходным путем. Когда я пытаюсь создать шифр в первой строке и передать cipher.getProvider() в качестве второго аргумента в KeyGenerator.getInstance(...), строка keyGenerator.init(...) выдает исключение Unknown param type: android.security.keystore.KeyGenParameterSpec.   -  person Alex    schedule 04.09.2020
comment
Я не уверена. Посмотрим, ответит ли кто-то более знающий. Единственное, что я могу предложить: Использование хранилища ключей Android для шифрования строк. Это не то же самое, что вы делаете. Но я знаю, что этот код работает, потому что недавно провел его рефакторинг.   -  person Elletlar    schedule 04.09.2020


Ответы (1)


Чтобы получить KeyInfo для симметричного ключа, необходим следующий код:

SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(secretKey.getAlgorithm(), "AndroidKeyStore");
KeyInfo keyInfo = (KeyInfo) secretKeyFactory.getKeySpec(secretKey, KeyInfo.class);
person Alex    schedule 07.09.2020