CryptGenRandom()线程安全吗?

时间:2017-09-11 03:34:24

标签: c winapi cryptography entropy

CryptGenRandom()线程安全是否具有单个全局程序范围的HCRYPTPROV实例?

MSDN似乎缺少有关此问题的任何信息:https://msdn.microsoft.com/en-us/library/windows/desktop/aa379942(v=vs.85).aspx

为每个线程创建一个单独的HCRYPTPROV并再次销毁它会使问题复杂化(并且还会冒更多与安全相关的错误),所以这对我们来说非常有用。共享一个全球HCRYPTPROV肯定会容易得多。

所以这里有人知道CryptGenRandom()的线程安全性,特别是对于一个HCRYPTPROV实例吗?

1 个答案:

答案 0 :(得分:2)

为每个帖子创建一个单独的HCRYPTPROV并没有多大意义。这是指向所有当前实现中堆的内存块的指针,主要是保存到CSP entry points的指针,用于调用实际的提供程序实现(在我们的例子中为CPGenRandom)。与包含实际键状态的示例HCRYPTKEY不同,引用本身不包含 CSP 状态。因此,即使您为每个线程创建单独的HCRYPTPROV - 这也不会改变任何内容。

在此调用期间, CSP 可能会在内部使用一些全局变量/数据;然而,这是未知的,因为这些将是实现细节。当然,我们可以在代码中序列化对CryptGenRandom的调用。但是我们无法控制我们进程中的其他一些dll同时调用CryptGenRandom。因此,序列化所有对CryptGenRandom的调用也是不可能的。

结果我认为CPGenRandom必须设计为线程安全的。我用我熟知的微软CSP测试这是真的。当需要访问全局数据并且多个线程同时调用CPGenRandom时,在函数中使用内部同步;每个线程都会收到唯一的随机数据。

所以我的结论 - CryptGenRandom是线程安全的,至少在所有Microsoft CSP