在我看来,默认情况下,C#/。NET的Bouncy Castle SecureRandom类仅使用DateTime.Now.Ticks作为其种子。

我错了,但是这样做并不安全吗?

评论

在这里和其他SE网站上,我看到许多有关Bouncy Castle的问题。真的那么糟糕吗?每当看到有人使用它时,我应该开始警告别人吗?

您能指出我的出处吗?也许将其添加到问题中?编辑:实际上,我想我明白了...

抱歉-我只是第19次浏览代码,才发现自己错了。是的,用时间作为种子进行生产是很糟糕的,不是,这不是所有充气城堡都可以做到的。实际上,BC SecureRandom有一个称为Master的静态实例,该实例是从Ticks和ThreadedSeedGenerator播种的。 “ SetSeed”方法令人困惑,因为它仅添加了来自Ticks的种子材料。不会降低已经存在的种子的强度。

那只是在J2ME上,我认为系统库没有SecureRandom。在其他地方应该使用系统之一,而应该使用操作系统熵源。

AFAIU,当不在J2ME上时,应使用系统库中的SecureRandom类。从技术上讲,实现定义了种子的播种方式,但通常是这样的-即读取/ dev / [u]种子材料的随机性。

#1 楼

是的,仅在系统时间内播种PRNG是不安全的。不,不是Bouncy Castle的SecureRandom所做的全部。 )。如果查看SecureRandom的静态声明,您会发现它实际上是Ticks和ThreadedSeedGenerator的组合的种子。

为什么系统时间不够用?只是系统时间是不安全的。加密货币随机生成器的全部要点是对手无法猜测的,并且通过使用系统时间作为随机数生成器的种子,您可以使对手更容易地猜测您的种子,从而猜测您的随机输出。 />
SetSeed(GetSeed(8));的精度为每秒一千万次滴答。假设攻击者知道您何时生成密钥,+ /-1秒。他们只需要做出2000万个猜测(大约$ 2 ^ {20} $美元)即可猜测您的随机种子。使用现代笔记本电脑,这可能在几秒钟内就可以破解。

假设攻击者完全不知道何时生成密钥。他们只知道是在2000年之后。比方说,从现在到2014年,这14年的整个空间占据了51-52位。 Master.GenerateSeed(length);…这意味着从系统时间生成的任何东西中,您可能都具有的绝对最高熵级别约为51位,该值足够小,很容易破解,实际上,您甚至永远都不会接近。

#2 楼

Bouncy Castle的所有随机生成器类似乎都来自java.security.SecureRandom,其中seed并不意味着“为此初始化状态”。它的意思是“从中搅拌任何熵”。

这意味着它们所做的并不是不安全的,但实际上也不应该提供帮助,因为java.security.SecureRandom已经从系统中植入了熵(例如/ dev) / urandom)。

我假定对于C#版本也是如此,尽管我不使用C#,所以不确定。