C# 线程中的 Bouncy Castle SecureRandom 安全吗?

Is BouncyCastle's SecureRandom in C# threadsafe?

在 Java 中的实现显然是 yes,但是 C# 中的 Org.BouncyCastle.Security.SecureRandom 又如何呢?

因为据我所知,没有关于 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 是线程安全的。