我正在尝试使用Java生成加密安全随机数,并使用以下代码部分创建SecureRandom对象以查看其提供者和算法:
Provider prov=new org.spongycastle.jce.provider.BouncyCastleProvider();
Security.insertProviderAt(prov, 1);
SecureRandom sr=new SecureRandom();
srProvider=sr.getProvider().toString();
srAlgorithm=sr.getAlgorithm();
(海绵城堡是由罗伯托·泰莱制作的机器人的弹性城堡 - https://github.com/rtyley)
当我显示提供者和算法时,它显示:加密版本1.0 SHA1PRNG
令我惊讶的是,即使将提供程序安装为代码中的第一个提供程序,提供程序也不是Spongycastle。我想问你a)在Spongy Castle(或Bouncy Castle)中没有实施SecureRandom。 b)“加密版本1.0”究竟是什么(我的意思是它是Sun JCE提供商还是什么?)
...谢谢
鲁维
答案 0 :(得分:3)
假设您在Android上运行(您没有明确说明这一点)。 Bouncy Castle不提供SecureRandom
实施。 'Crypto'是Apache Harmony(Android的大部分核心Java代码都基于它)JCE提供者。 Android中没有Sun JCE代码。 BTW,'Crypto'提供程序仅提供SHA1PRNG(RNG),SHA-1(哈希)和SHA1withDSA(签名)实现。其他一切都是由Bouncy Castle或基于OpenSSL的提供商提供的。
问题:为什么你认为你需要从Bouncy / Spongy Castle实施SecureRandom
?
答案 1 :(得分:2)
Bouncy Castle 提供一组 Pseudo 随机数生成器(PRNG)。 PRNG有很多名字; NIST将它们称为确定性随机比特生成器(DRBG)。然而,它们仅在包装org.bouncycastle.crypto.prng
中的Bouncy Castle的“轻量级”API中可用。
但是,Bouncy Castle是加密算法的纯软件实现。这意味着它不包含 entropy 的来源。熵不能仅由软件生成,因为软件算法本身是确定性的。因此,即使Bouncy Castle提供商在其"BC"
提供商(或Android的Spongy提供商)中注册某些生成器,它仍然必须依赖与平台SecureRandom
实现相同的熵源。
由于熵源可能是大多数性能问题的罪魁祸首,因此您不应期望Bouncy Castle的奇迹与随机数生成效率有关。
目前(v1.54)Bouncy Castle提供商根本没有注册任何SecureRandom
实现,所以就是这样。