Ключи потеряны из файла BKS без команды deleteKey

Я использую хранилище ключей (формат BKS) в своем приложении для Android для хранения общедоступных закрытых пар ключей. Приложение использовалось долгое время и имело 10+ пар открытых и закрытых ключей. Внезапно перестала работать одна из основных функций приложения. Основная причина была обнаружена в следующем:

В файле BKS осталась только одна пара открытых закрытых ключей. Все остальные пары ключей потеряны. Я проверил в коде, что KeyStore.deleteEntry (псевдоним) нигде в приложении не вызывается. Единственное место, где я мог найти, если что-то пошло не так, это следующее:

Мы создаем пару ключей и устанавливаем ее, используя:

KeyStore.setKeyEntry(keyId, keyPair.getPrivate(), getKeyStorePassword(), certChain);

В javadoc вышеупомянутого метода указано следующее: Если данный псевдоним уже существует, информация о хранилище ключей, связанная с ним, переопределяется данным ключом (и, возможно, цепочкой сертификатов).

Обычно строка, полученная с сервера, которая является UUID, используется как псевдоним для установки новой KeyPair в KeyStore. Таким образом, вероятность того, что новый псевдоним будет таким же, как тот, который уже присутствует в хранилище ключей, очень маловероятна. Даже если это так, он просто переопределил бы одну пару ключей. Но в этом случае теряется около 10+ пар ключей.

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

Дополнительная информация:

  1. Я обнаружил, что сертификат, связанный с открытым ключом для каждой пары ключей, действителен только в течение 1 года. Я думал, что пары ключей, для которых истек срок действия сертификата, могут быть удалены при установке новой пары ключей в хранилище ключей. Но когда я выполнил тестовый пример, изменив срок действия на 30 дней и изменив время устройства более чем на 30 дней, проблема не могла быть воспроизведена.

  2. Еще одна вещь, в которой я не уверен, актуальна ли она для этой проблемы: в настоящее время серийный номер для всех генерируемых сертификатов - BigInteger.ONE:

    X509v1CertificateBuilder certBuilder = новый JcaX509v1CertificateBuilder ( subject, BigInteger.ONE, notBefore, notAfter, subject, keyPair.getPublic ());

Я думаю, что это неправильно, но я не уверен, может ли это привести к моей проблеме.

  1. Ниже приведен список поставщиков безопасности (Security.getProviders()) на устройстве, на котором была обнаружена эта проблема:

    • AndroidKeyStoreBCWorkaround версии 1.0
    • AndroidOpenSSL версии 1.0
    • BC версия 1.52
    • Крипто версия 1.0
    • HarmonyJSSE версии 1.0
    • AndroidKeyStore версии 1.0

Итак, все криптографические операции Java выполняются с использованием AndroidKeyStoreBCWorkaround версии 1.0. Устройство - Nexus 5, Android 6.0.1.

@ nikolay-elenkov, не могли бы вы дать несколько советов?

garnet 07.06.2018 16:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
46
0

Другие вопросы по теме