无法让KeyPairGenerator生成随机密钥

时间:2019-05-06 18:02:39

标签: android rsa sha1 public-key-encryption android-keystore

我正在尝试生成Android上的公共/私有RSA密钥对,以用于签名:

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...

问题是,当我使用在AVD上运行的android工具测试进行测试时,关键是总是相同,这是我没想到的,因为我使用的是称为SecureRandom的东西,来源(我本以为会使用类似当前时间的方法来帮助产生熵?)。我尝试使用不同的AVD擦除AVD上的数据,更改别名,我总是得到相同的密钥,提示它使用的是静态种子(这对我没有任何意义-类的名称为SecureRandom ,而且似乎一点也不安全吗?)

有两个类似的问题也无济于事:

  • This one:此处的建议是在获取KeyPairGenerator实例时不指定提供程序。这似乎没有什么区别。

  • This one:显然,添加了名为spongycastle的内容作为提供程序可以解决此问题-我真的不想添加第3方库来执行此操作,尤其是看起来很古老且没有维护时间更长

PS如果我删除密钥对:

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

并生成另一个密钥,我得到一个新的不同密钥。但这显然无济于事- first 键始终相同。

我在做什么错?我怀疑SecureRandom.getInstance("SHA1PRNG")至关重要,但是我不知道该怎么做。谢谢!

0 个答案:

没有答案