2012-04-21 50 views
5

我试图使用加密安全随机数Java和使用下面的代码段创建一个SecureRandom对象,以查看其供应商和算法生成:BouncyCastle有SecureRandom服务吗?

Provider prov=new org.spongycastle.jce.provider.BouncyCastleProvider(); 
Security.insertProviderAt(prov, 1); 

SecureRandom sr=new SecureRandom(); 
srProvider=sr.getProvider().toString(); 
srAlgorithm=sr.getAlgorithm(); 

(海绵状城堡充气城堡相当于为Android所作罗伯托Tyley - https://github.com/rtyley

当我显示提供商和算法,它表明:加密版本1.0 SHA1PRNG

让我惊讶的是,如果它被安装在代码中第一个提供供应商甚至没有Spongycastle 。我想问你a)是不是在Spongy Castle(或Bouncy Castle)实施SecureRandom。 B)什么 “加密版本1.0” 到底是(我的意思是它是Sun JCE提供还是什么?)

谢谢...

鲁维

回答

3

假设你正在运行在Android上(你没明确说明)。 Bouncy Castle不提供SecureRandom实施。 'Crypto'是Apache Harmony(基于大多数Android核心Java代码的JCE提供商)。 Android中没有Sun JCE代码。顺便提一句,'Crypto'提供者只提供SHA1PRNG(RNG),SHA-1(散列)和SHA1withDSA(签名)实现。其他的一切都是由Bouncy Castle或基于OpenSSL的提供商提供的。

问:为什么你认为你需要从快活/海绵城堡SecureRandom实施?

+0

谢谢尼古拉。只是想知道SHA1PRNG是否有替代选择。在随机检查工具中检查SHA1PRNG和其他人会很好。 – 2012-04-22 17:23:39

+0

至少在ICS(股票Galaxy Nexus)上是唯一的'SecureRandom'实现。 SHA1PRNG是一种PRNG,因此它只与您给它的种子一样好。它从'/ dev/urandom'播种,所以它可能不是那么好。再次,这是ICS,但我怀疑它会在其他版本上有任何不同。 '/ dev/random'在Android上可能会很慢,所以我想这就是为什么它没有被使用。如果你真的使用工具进行检查,请将它链接到这里。 – 2012-04-23 01:52:43

+0

@ Nikolay Elenkov:谢谢你的信息。我如何才能看到我的Android设备上是否使用dev/random或dev/urandom作为种子源,以及如何在代码中动态更改它? – 2012-05-06 09:51:51

2

充气城堡确实提供了一组随机数生成器(PRNG)。 PRNG的名字很多, NIST称它们为确定性的随机位发生器(DRBG)。但是,它们只能在Bouncy Castle的“轻量级”API中使用,包装为org.bouncycastle.crypto.prng

然而,充气城堡是一个纯软件实现的加密算法。这意味着它不包含的来源。由于软件算法本身是确定性的,熵不能单独由软件生成。因此,即使在充气城堡供应商将在其"BC"提供商(或海绵供应商为Android)注册一些发电机的那么它仍然要依赖于相同的熵源为平台SecureRandom执行情况。

由于熵源可能对于大多数性能问题的罪魁祸首,你不应该期望与问候随机数生成效率充气城堡的奇观。

目前(v1.54)的充气城堡供应商根本不会登记任何SecureRandom实现,所以有这一点。

+1

看起来Bouncy Castle 1.57正在注册一个SecureRandom实现。 – martijno 2017-06-16 21:55:00