Не удается получить KeyPairGenerator для генерации случайных ключей - PullRequest
1 голос
/ 06 мая 2019

Я пытаюсь сгенерировать пары открытых / закрытых ключей RSA, например, на Android, чтобы использовать для подписи:

val keyPairGenerator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore")

val certStart = Calendar.getInstance()
val certEnd = Calendar.getInstance()
certEnd.add(Calendar.YEAR, 30)

val spec = KeyPairGeneratorSpec.Builder(context)
     .setAlias("MyKeyAlias")
     .setKeySize(1024)
     .setSubject(X500Principal("CN=CryptoIsHard"))
     .setSerialNumber(BigInteger.ONE)
     .setStartDate(certStart.time)
     .setEndDate(certEnd.time)
     .build()

 keyPairGenerator.initialize(spec, SecureRandom.getInstance("SHA1PRNG"))
 keyPairGenerator.generateKeyPair()

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

30819F300D06092A864886F70D010101050003818D00308...

Проблема в том, что, когда я тестирую это с помощью тестов инструментов Android, работающих на AVD, ключом является всегда тот же , который я не делаложидать, потому что я использую что-то под названием SecureRandom в качестве источника (я бы подумал, что будет использовать что-то вроде текущего времени, чтобы помочь генерировать энтропию?).Я пытался стереть данные на AVD, используя разные AVD, меняя псевдоним, я всегда получал один и тот же ключ, предполагая, что он использует статическое начальное число (для меня это не имеет никакого смысла - имя класса - SecureRandomи кажется, что это не совсем безопасно?)

Есть пара похожих вопросов, которые не помогают:

  • Этот: здесь предлагается не указывать поставщика при получении экземпляра KeyPairGenerator.Кажется, это не имеет никакого значения.

  • Этот : очевидно, добавление чего-то под названием spongycastle в качестве поставщика решило проблему - я не очень хочудля этого добавьте стороннюю библиотеку, особенно ту, которая выглядит довольно древней и больше не поддерживается

PS Если я удалю пару ключей:

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

И сгенерировать другой ключ, я получаю новый и другой ключ.Но это, очевидно, не помогает - клавиша first всегда одинакова.

Что я делаю не так?Я подозреваю, что SecureRandom.getInstance("SHA1PRNG"), но это важно, но я не знаю, что попробовать.Спасибо!

...