Windows上的/ dev / urandom等价物?

我的应用程序希望得到一个随机数,最好是熵(如果可用的话),但不需要密码质量,并且希望确保在系统熵池耗尽的情况下调用不会阻塞(例如,在农场的服务器上)。 我知道CryptGenRandom( http://msdn.microsoft.com/en-us/library/windows/desktop/aa379942 (v=vs.85) .aspx ),但其在不利的熵条件下关于阻塞的行为是未标明。 在Unix上,/ dev / urandom支持这个用例。 Windows上有相同的function吗? 我宁愿避免使用非系统的RNG来获得非阻塞语义。

对于一个玩具应用程序,你可以使用rand() ,但是Windows上的实现质量差。

更好的方法是在程序中包含一个合适的伪随机数生成器。 Mersenne Twister是IMO的一个很好的选择,特别是有很多可用的实现(包括在C ++ 11标准库和Boost中)。

如果我需要随机数的非阻塞行为,我通常会预先生成n数字并将它们存储在内存变量中:即,如果我知道每秒需要30个随机数,则需要3秒来计算它们(包括块) ,那么当主代码加载时,我将预先生成300,将它们存储在一个数组或矢量中,并根据需要使用它们; 在使用它们的时候,我每次用一个线程在另一个线程上生成另一个线程,用新生成的随机数字代替新生成的随机数字并移动到列表中的下一个,这样当我达到极限时(在这种情况下300)我知道什么时候我可以简单地从我的数组/矢量/列表开始,并且所有的随机数都是新鲜的,并且是非阻塞的(因为它们是预先生成的)。

这意味着你可以使用任何你喜欢的随机数生成器,而不用担心阻塞行为,但是它的代价是使用更多的RAM,但是对于我需要随机数的编码来说可以忽略不计。

希望这有助于,因为我不能把这一切都纳入评论:)

你可以等待一个充满熵的好种子,并按照GMasucci的建议预先生成一长串随机数。

除非你的系统已经被破坏,否则似乎是一个好种子,足以产生一系列非相关的数字,如http://www.2uo.de/myths-about-urandom/

从讨论中我得到,只有当你的系统状态(你的熵源是已知的,攻击者知道他们的当前状态)时才需要连续的(“真实”/“新鲜的”)随机数字,这在某些时候会受到影响。 在喂食你的块密码以后,其输出的可预测性就会降低。

种子的来源? 两个或更多的可信软件不太可能已经被破坏。 我试图模糊使用时间函数作为种子的函数的可预测性:local rand_function()+一些变量延迟+ mysql的rand()。 从那里,一些好的图书馆产生的伪随机数列表。