SecureRandom
类仅使用DateTime.Now.Ticks
作为其种子。我错了,但是这样做并不安全吗?
#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#,所以不确定。
评论
在这里和其他SE网站上,我看到许多有关Bouncy Castle的问题。真的那么糟糕吗?每当看到有人使用它时,我应该开始警告别人吗?您能指出我的出处吗?也许将其添加到问题中?编辑:实际上,我想我明白了...
抱歉-我只是第19次浏览代码,才发现自己错了。是的,用时间作为种子进行生产是很糟糕的,不是,这不是所有充气城堡都可以做到的。实际上,BC SecureRandom有一个称为Master的静态实例,该实例是从Ticks和ThreadedSeedGenerator播种的。 “ SetSeed”方法令人困惑,因为它仅添加了来自Ticks的种子材料。不会降低已经存在的种子的强度。
那只是在J2ME上,我认为系统库没有SecureRandom。在其他地方应该使用系统之一,而应该使用操作系统熵源。
AFAIU,当不在J2ME上时,应使用系统库中的SecureRandom类。从技术上讲,实现定义了种子的播种方式,但通常是这样的-即读取/ dev / [u]种子材料的随机性。