【发布时间】:2018-03-29 06:38:30
【问题描述】:
如Random number generator only generating one random number 所述,每次您需要另一个随机数时创建System.Random 的新实例通常是不正确的,因为System.Random 是根据时钟播种的,因此在同一滴答声中创建了多个实例将产生相同的随机数。因此,一种常见做法(至少在单线程应用程序中)是创建 Random 的单个实例,并将其存储在用于所有随机数生成的静态字段中。
另一方面,RNGCryptoServiceProvider 没有这个特殊缺陷...但显然是 costly to instantiate,因此再次建议存储和重用它的单个实例。
Org.BouncyCastle.Security.SecureRandom 怎么样?我是否同样需要存储和重用它的单个实例,或者每次我需要另一个随机数时按需创建实例基本上没问题?
【问题讨论】:
-
相关(因为它也是关于如何正确使用此类的未记录基础知识):stackoverflow.com/q/46792243/1709587
-
我认为这取决于您在实践中需要随机数的频率。在我自己的一个项目中,我使用
RNGCryptoServiceProvider.Create()为该站点的每个新用户生成会话令牌,并且性能每天处理 1,000 次访问。那么你多久需要一个随机数呢? -
从您评论中链接的答案中,您最终会为每个 SecureRandom 实例实例化一个新的 RNGCryptoServiceProvider。除了这个表现之外,它看起来还不错。
-
@JamesKPolk 实际上
Master随机生成器(使用RNGCryptoServiceProvider)是静态单例,所以它被初始化一次,而不是每次创建SecureRandom。我不认为确实如此,创建new RNGCryptoServiceProvider()的成本很高。在内部它使用非托管 api,如果您使用默认构造函数 - 它将使用相同的非托管“句柄”,基本上在重用一个实例和每次创建新实例之间没有区别(因为它们都使用相同的非托管“句柄”)。 -
@Evk:感谢您纠正我,并感谢您在其他链接上的回答。在这种情况下,应该既不存在安全问题,也不存在性能问题。
标签: c# random cryptography bouncycastle