BouncyCastle有SecureRandom服务吗?

时间:2012-04-21 14:28:05

标签: java android bouncycastle

我正在尝试使用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提供商还是什么?)

...谢谢

鲁维

2 个答案:

答案 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实现,所以就是这样。