Хранение секретного ключа в Android KeyStore с использованием API 18 и выше

Безопасность не является моей областью знаний, но у меня есть вопрос относительно хранения секретного ключа в хранилище ключей Android с использованием API 18 и выше. Я использую следующий код, чтобы попытаться сохранить свой ключ:

KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);

KeyStore.SecretKeyEntry sKeyEntry = new KeyStore.SecretKeyEntry(ivKey);

ks.setEntry(ALIAS, sKeyEntry, null); // This is where the issue is

Я понимаю, что "null" должен быть параметром KeyProtection, который я создаю, но он недоступен для API 18. Есть ли обходной путь для этой проблемы? Мне было трудно найти что-нибудь, что работает.

EDIT Я должен упомянуть, что если оставить его равным нулю, возникает ошибка:

java.security.KeyStoreException: Protection parameters must be specified when importing a symmetric key


person Colton Weaver    schedule 02.04.2017    source источник


Ответы (2)


AndroidKeyStore не поддерживал секретные ключи до уровня API 23. Чтобы делать то, что вы пытаетесь сделать, вам нужно настроить таргетинг на 23 или выше.

Что вы можете сделать, так это использовать поддержку AndroidKeyStore для пар открытого и закрытого ключей (например, RSA) для шифрования материала секретного ключа, а затем сохранить его в локальном файле. Если вы хотите использовать его, вам нужно будет использовать закрытый ключ для его расшифровки, а затем, когда у вас есть материал ключа, используйте обычные криптографические API Java (т.е. не указывайте «AndroidKeyStore») для выполнения операций шифрования с ним.

Чтобы узнать, как использовать пары ключей AndroidKeyStore RSA для шифрования и дешифрования, см. rel="nofollow noreferrer">http://www.androidauthority.com/use-android-keystore-store-passwords-sensitive-information-623779/

Однако я не думаю, что на самом деле это что-то дает с точки зрения безопасности. Каких целей безопасности вы пытаетесь достичь?

person divegeek    schedule 15.04.2017
comment
Почему нельзя использовать AndroidKeyStore? Есть ли недостаток? - person Trupti Nasit; 22.07.2017
comment
@TruptiNasit, вы можете и должны использовать AndroidKeyStore на Marshmallow и выше. До Marshmallow есть проблемы (doridori.github.io/android-security- хранилище забывчивых ключей). - person divegeek; 04.01.2019

Для создания ключа RSA (открытого/закрытого) с помощью AndroidKeyStore вы можете использовать следующие методы.

Получение хранилища ключей

val keyStore = KeyStore.getInstance("AndroidKeyStore")
keyStore.load(null)

Проверить, содержит ли KeyStore наш ключ или нет

Если KeyStore не содержит ключа, создайте ключи

    if (!keyStore.containsAlias(KEY_NAME)) {

        val keyPairGenerator = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore")
        keyPairGenerator.initialize(
            KeyGenParameterSpec.Builder(
                KEY_NAME,
                KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
            )
                .setAlgorithmParameterSpec(RSAKeyGenParameterSpec(2048, F4))
                .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
                .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)
                .build()
        )

        val keyPair = keyPairGenerator.generateKeyPair()
        val publicKey = keyPair.public
        val privateKey = keyPair.private
    }

Получить ключи с помощью KEY_NAME

val privateKeyEntry = keyStore.getEntry(KEY_NAME, null) as KeyStore.PrivateKeyEntry
val privateKey = privateKeyEntry.privateKey
val publicKey = privateKeyEntry.certificate.publicKey

Для получения дополнительной информации вы можете обратиться к этому:

person Dhaval    schedule 20.02.2019