Для своего приложения я создаю ключ 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?
Теоретически я мог бы использовать асимметричное шифрование, так как это всего лишь небольшой фрагмент данных, которые я хочу зашифровать/расшифровать, но я все же предпочел бы использовать симметричное шифрование.
У вас есть идея?
Изменить: добавлены дополнительные детали реализации.
AES/GCM/NoPadding
. Интересно, чтоAndroidKeyStoreBCWorkaround
вызывает исключение при генерации ключа. - person Alex   schedule 03.09.2020cipher.getProvider()
в качестве второго аргумента вKeyGenerator.getInstance(...)
, строкаkeyGenerator.init(...)
выдает исключениеUnknown param type: android.security.keystore.KeyGenParameterSpec
. - person Alex   schedule 04.09.2020