我正在阅读有关Random.Next()的信息,"适用于创建随机密码的加密安全随机数"MSDN建议使用RNGCryptoServiceProvider类
速度是多少?获得真正的随机数有一些最快的方法吗?
编辑:使用Random.Next()我得到一个新的随机数.与...
byte[] randomNumber = new byte[1]; RNGCryptoServiceProvider Gen = new RNGCryptoServiceProvider(); Gen.GetBytes(randomNumber); int rand = Convert.ToInt32(randomNumber[0]);
我得到一个"加密安全随机数"我想知道如果上面的代码与"Random.Next()"比较快,如果有一些快速的方法来获得相同的结果,好吗?
回答问题的最简单方法可能是将问题颠倒过来.
假设 CryptoServiceProvider实现具有所有优点.它同样快,并且使用与Random.Next一样少的内存.
那为什么两个实现都存在?为什么我们甚至在框架中有 Random.Next?
看看我们对每个实现的了解.一个生成加密安全随机数,另一个不做任何承诺.
哪个更简单?生成随机数,这些随机数足够随机,可用于加密,或生成简单"看起来"随机的数字,但不保证其他任何内容?如果没有与生成加密安全随机数相关的成本,那么每个随机数生成器都会这样做.
您通常可以假设标准库函数旨在执行它在框中所说的内容并且做得很好.Random.Next旨在尽可能高效地为您提供伪随机数序列中的下一个随机数.
CryptoServiceProvider旨在生成足够强大的随机数,以便在加密中使用,并尽可能高效地执行此操作.如果有办法尽可能高效Random.Next做到这一点,那么Random.Next会使用它太.
你的问题似乎假设框架设计者的脑损伤 - 他们以某种方式设计了一个不必要的慢函数来生成加密安全的随机数,即使有更快的方法.
生成加密安全随机数的最快方法是最有可能调用专家设计的函数来生成加密安全随机数.
关于安全性和加密技术的经验法则:
永远不要写自己的.采用标准的方式,避免危险的优化.
使用Random.Next
时,你需要在安全性敏感的代码,而不是用统计学的随机数RNGCryptoServiceProvider
在安全敏感的代码.它没有那么快,Random.Next
但它具有可接受的性能.您应该通过基准来查看实际差异.牺牲性能安全性通常没有意义.
您的示例代码生成的"加密安全随机数"只会介于0和255之间(包括0和255)!
如果要返回所有可能的Int32
值,则应使用4个随机字节.您的代码应如下所示:
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); byte[] rndBytes = new byte[4]; rng.GetBytes(rndBytes); int rand = BitConverter.ToInt32(rndBytes, 0);
我(旧式)机器的快速基准测试表明它Random.Next
比使用速度快约200倍RNGCryptoServiceProvider
.
您首先应该做的是学习RNG,PRNG和CSPRNG之间的基本差异.
只有在此之后,您才应该决定您真正需要什么,以及可能的实施方式.但是,作为一般规则,您应该接受已经建立并证明是正确实施的内容.
在硬件中获得真正随机数的唯一已知方法是缓慢的; 如果你试图加快速度,你的头发会变成白色,掉在丛中,然后NRC发送机器人来清理服务器机房.
我和Mehrdad在这一方面:不要试图自己动手.