CryptGenRandom()线程安全是否具有单个全局程序范围的HCRYPTPROV实例?
MSDN似乎缺少有关此问题的任何信息:https://msdn.microsoft.com/en-us/library/windows/desktop/aa379942(v=vs.85).aspx
为每个线程创建一个单独的HCRYPTPROV并再次销毁它会使问题复杂化(并且还会冒更多与安全相关的错误),所以这对我们来说非常有用。共享一个全球HCRYPTPROV肯定会容易得多。
所以这里有人知道CryptGenRandom()的线程安全性,特别是对于一个HCRYPTPROV实例吗?
答案 0 :(得分:2)
为每个帖子创建一个单独的HCRYPTPROV
并没有多大意义。这是指向所有当前实现中堆的内存块的指针,主要是保存到CSP entry points的指针,用于调用实际的提供程序实现(在我们的例子中为CPGenRandom
)。与包含实际键状态的示例HCRYPTKEY
不同,引用本身不包含 CSP 的状态。因此,即使您为每个线程创建单独的HCRYPTPROV
- 这也不会改变任何内容。
在此调用期间, CSP 可能会在内部使用一些全局变量/数据;然而,这是未知的,因为这些将是实现细节。当然,我们可以在代码中序列化对CryptGenRandom
的调用。但是我们无法控制我们进程中的其他一些dll同时调用CryptGenRandom
。因此,序列化所有对CryptGenRandom
的调用也是不可能的。
结果我认为CPGenRandom
必须设计为线程安全的。我用我熟知的微软CSP测试这是真的。当需要访问全局数据并且多个线程同时调用CPGenRandom
时,在函数中使用内部同步;每个线程都会收到唯一的随机数据。
所以我的结论 - CryptGenRandom
是线程安全的,至少在所有Microsoft CSP