【发布时间】:2018-03-29 06:27:27
【问题描述】:
答案显然是yes 用于Java 中的实现,但是Org.BouncyCastle.Security.SecureRandom 在C# 中呢?
【问题讨论】:
-
相关(因为它也是关于如何正确使用此类的未记录基础知识):stackoverflow.com/q/46792373/1709587
标签: c# random cryptography bouncycastle
答案显然是yes 用于Java 中的实现,但是Org.BouncyCastle.Security.SecureRandom 在C# 中呢?
【问题讨论】:
标签: c# random cryptography bouncycastle
因为据我所知,没有关于 C# Bouncy Castle 移植的官方(甚至任何)文档 - 我们所能做的就是查看源代码并尝试得出一些结论。这是SecureRandom的源代码。我们可以看到主要有NextCounterValue(用于生成种子)和NextBytes用于生成实际随机数据的方法。 NextCounterValue 是线程安全的(使用 Interlocked.Increment)。 NextBytes 将实现转发到 IRandomGenerator 的实例。由于您可以将IRandomGenerator 的任何实例传递给SecureRandom 的构造函数——我们可以得出结论,它的线程安全取决于所使用的IRandomGenerator。
此外,在完整的 .NET Framework 上,SecureRandom 使用 CryptoApiRandomGenerator 作为主生成器(用于生成种子),并且它只是 .NET RNGCryptoServiceProvider 的包装器,我们知道这是线程安全的。
如果你只创建SecureRandom 而不传递任何IRandomGenerator 会怎样?然后它将创建DigestRandomGenerator (code) 的实例,这似乎是线程安全的(在NextBytes 中使用简单的lock)。
总而言之,如果您不传递对它来说不是线程安全的IRandomGenerator 实例,我们可以说SecureRandom 是线程安全的。
【讨论】: