Я пытаюсь сгенерировать пары открытых / закрытых ключей 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")
, но это важно, но я не знаю, что попробовать.Спасибо!