Инициализация хранилища ключей Android

Во-первых, я новичок в программировании для Android, хотя я не новичок в самом программировании. По сути, я пытаюсь сохранить свои ключи шифрования в хранилище ключей Android. Кажется, в самом GOOGLE феноменально не хватает такой информации. Поскольку по этой теме не так много практических рекомендаций, я предполагаю, что это не совсем стандартное знание. Так может кто-нибудь, пожалуйста, дайте мне пример кода для

  1. Инициализируйте хранилище ключей (будет использоваться AES-256).
  2. Сохраните несколько ключей в KeyStore (пожалуйста, сообщите мне максимальное количество ключей, которое я могу хранить в 1 KeyStore, так как я планирую сохранить не менее 100 ключей).
  3. Получить ключи из KeyStore.
  4. Редактировать ключи
  5. Удалить ключи
  6. Удалить все хранилище ключей

Итак, по сути код для всех основных функций хранилища ключей. Спасибо заранее за помощь.


person Pier Telford Godeaux    schedule 02.03.2015    source источник
comment
Взгляните на это.   -  person Hemanth    schedule 02.03.2015


Ответы (2)


Если вы установите для minSdkVersion значение 23 или выше, Android M позволяет легко генерировать симметричные ключи и управлять ими с этого месяца.

Проверьте 4-й пример, указанный здесь. https://developer.android.com/reference/android/security/keystore/KeyGenParameterSpec.html

 KeyGenerator keyGenerator = KeyGenerator.getInstance(
         KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
 keyGenerator.init(
         new KeyGenParameterSpec.Builder("key2",
                 KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
                 .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
                 .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
                 .build());
 SecretKey key = keyGenerator.generateKey();

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

 // The key can also be obtained from the Android Keystore any time as follows:
 KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
 keyStore.load(null);
 key = (SecretKey) keyStore.getKey("key2", null);

Этот пример также был полезен. https://github.com/googlesamples/android-ConfirmCredential/blob/master/Application/src/main/java/com/example/android/confirmcredential/MainActivity.java

person nburn42    schedule 24.08.2015
comment
А что, если вы хотите поддерживать как старые (например, API 18), так и новые (API 23+) устройства, используя одно и то же решение? - person Diti; 11.08.2016
comment
Давно к этому не прикасался, но насколько я помню хорошего решения не было. - person nburn42; 12.08.2016
comment
это должно быть keyGenerator.init вместо keyGenerator.initialize. Для KeyGenerator нет такого метода, как initialize(). initialize() метод находится в KeyPairGenerator - person siulkilulki; 06.11.2016

Я думаю, что Android Key Store не поддерживает симметричные ключи, такие как ключи AES. См. здесь. Кстати, зачем приложению так много симметричных ключей? Я предлагаю вам сохранить один главный асимметричный ключ в хранилище ключей и использовать этот ключ для шифрования многих других симметричных ключей в вашем приложении. Надеюсь, вы скоро решите свою проблему.

person candy    schedule 26.06.2015
comment
Генерация и хранение симметричных ключей в Android KeyStore поддерживаются начиная с Marshmallow (Android 6/API Level 23). Подробнее см. здесь. - person Adil Hussain; 08.02.2016