Android Strong Box - импорт ключей, требующих аутентификации пользователя для использования - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь безопасно импортировать ключи AES в StrongBox (аппаратный TEE) телефона pixel 3, работающего Android 10.

Ключи импортируются упакованными и зашифрованными с помощью ключа-обертки (с сильной коробкой) как описано здесь: https://developer.android.com/training/articles/keystore#ImportingEncryptedKeys

Обертывание ключа немного сложное, но следующий тестовый класс android дает хороший пример: https://android.googlesource.com/platform/cts/+/master/tests/tests/keystore/src/android/keystore/cts/ImportWrappedKeyTest.java

Я могу правильно выполнять операции шифрования с помощью ключей AES , импортированных с аттестациями ключей, указывающими, что для использования ключа не требуется аутентификация пользователя (путем установки флага '503' (Tag :: NO_AUTH_REQUIRED) в ключе часть описания структуры аттестации ASN1).

Но как только я захочу защитить использование этих ключей с помощью аутентификации пользователя , (установив флаги '504' (Tag :: USER_AUTH_TYPE) ) или / и '505' (Tag :: AUTH_TIMEOUT) в описании ключа) импорт ключа все еще успешен, но любой вызов Cipher # init с использованием одного из этих ключей вызывает следующее исключение :

android .security.keystore.KeyPermanentlyInvalidatedException: ключ окончательно признан недействительным

Тот же Cipher # init вызов с использованием ключей настроен с той же защитой, но напрямую сгенерирован в Android Keystore с помощью:


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

                KeyGenParameterSpec specs = new KeyGenParameterSpec.Builder("test", KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
                        .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
                        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
                        .setIsStrongBoxBacked(true)
                        .setUserAuthenticationRequired(true)
                        .setKeySize(256)
                        .build();

                keyGenerator.init(specs);
                keyGenerator.generateKey();

не выдает никаких исключений, и операции шифрования могут выполняться после аутентификации клиента.

Я открыл тикет в системе отслеживания проблем Google: https://issuetracker.google.com/issues/134205183 с дополнительной информацией о Android внутренних классах хранилища ключей, в которые я копался, но он вообще не активен.

...