我想做一些javascript和加密的实验,我很好奇随机函数的实现有多么不可预测.有人做过任何硬测试吗?
显然,浏览器能够生成强随机性(对于ssl).问题是他们给javascript访问相同的力量.
通常,随机函数的加密性不强,因为您需要确保使用加密伪随机数生成器.
通用随机函数通常不使用加密强生成方法,因为它们比简单生成方法花费更长时间(例如,Yarrow比Mersenne Twister更复杂)并且需要仔细管理熵池,这不能保证Mozilla,cstdlib,等想要给你.
如果您需要访问加密强大的随机数生成器,我会考虑访问底层的SSL实现(给定的浏览器可能允许或不允许访问).
最近的浏览器揭示了window.crypto.getRandomValues()
加密强大的内容.
还有一些JS库可以实现强大的RNG,但是没有getRandomValues()
它可以很难收集熵.它可以通过鼠标和键盘完成,虽然可能需要很长时间.
Math.random()
在2008年的大多数浏览器中都很弱--Amit Klein的论文详细介绍了 - 可悲的是,今天几乎一样弱.
更新:看来几乎所有的浏览器在2015 - 2016年切换到XorShift128 + -上LFSR快速变型调整,以良好的统计特性,但也非常弱密码:https://lwn.net/Articles/666407/, https://开头的安全性. stackexchange.com/questions/84906/predicting-math-random-numbers.以下详细信息已过期.
Firefox使用了一个非常弱的"我们自己的自制LFSR"算法; 自2006年以来,他们一直在讨论转向更强大的算法和熵源(bug 322529).更新:2015年他们转向XorShift128 +.
在2013年5月,他们至少将种子从当前时间切换到良好的熵源(错误868860),同时消除(?)交叉标签泄漏.
Webkit 自2009年以来使用弱快速算法(GameRand), 但自2010年以来(在每种情况下)来自强大的操作系统源的强大RNG的种子.
(我认为这是Safari使用的,但我可能会对各种WebKit端口感到困惑......)
Chrome不使用WebKit的随机,在V8中做自己的弱线性事物.
Math.random()是否应该是强大的(bug 246054).
不确定它是如何播种的.V8具有SetEntropySource()钩子,但显然它仅用于单元测试,而不是Chrome调用.如果没有调用,random()
则用于播种.
国家在2011年成为了每个环境,但是对于弱播种来说这并不是很有用.
Opera 在2009年1月宣布修复它并在这里说他们的Math.random()在加密方面很强大.
没有找到关于IE现在做什么的文档.他们在2008年的线性PRNG较弱(见论文).他们确实告诉Amit他们会在服务包中修复它,所以可能会在某处提供咨询......
我熟悉的每个JavaScript引擎都不使用加密强RNG.
如果你需要一个良好的熵源在浏览器中(并且最好不经常需要它),我建议捕获鼠标移动数据并通过加密强哈希算法运行它.诸如Entropy Gathering Daemon(与gpg一起使用)的现有程序可以用作如何实现这样的系统的参考.