Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CryptGenRandom()是线程安全的吗?_C_Winapi_Cryptography_Entropy - Fatal编程技术网

CryptGenRandom()是线程安全的吗?

CryptGenRandom()是线程安全的吗?,c,winapi,cryptography,entropy,C,Winapi,Cryptography,Entropy,CryptGenRandom()对于单个全局程序范围的HCRYPTPROV实例是线程安全的吗 MSDN似乎缺少以下方面的任何信息: 为每个线程创建一个单独的HCRYPTPROV并再次销毁它会使事情变得非常复杂(同时也会使我面临更多与安全相关的bug),因此了解这一点非常有用。共享一个全局HCRYPTPROV肯定会容易得多 这里有没有人知道CryptGenRandom()的线程安全性,特别是对于单个HCRYPTPROV实例?为每个线程创建一个单独的HCRYPTPROV没有多大意义。这是指向当前所有

CryptGenRandom()对于单个全局程序范围的HCRYPTPROV实例是线程安全的吗

MSDN似乎缺少以下方面的任何信息:

为每个线程创建一个单独的HCRYPTPROV并再次销毁它会使事情变得非常复杂(同时也会使我面临更多与安全相关的bug),因此了解这一点非常有用。共享一个全局HCRYPTPROV肯定会容易得多


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

为每个线程创建一个单独的
HCRYPTPROV
没有多大意义。这是指向当前所有实现中堆中内存块的指针,主要是保存的指针,用于调用实际的提供程序实现(
CPGenRandom
)。引用本身不包含CSP的状态,与包含实际密钥状态的
HCRYPTKEY
不同。因此,即使为每个线程创建一个单独的
HCRYPTPROV
,这也不会改变什么

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

因此,我认为
CPGenRandom
必须设计成线程安全的。这是我与著名的微软CSP的测试,这是真的。函数中使用内部同步,当需要访问全局数据时,如果多个线程同时调用
CPGenRandom
;每个线程接收唯一的随机数据


因此,我的结论-
CryptGenRandom
是线程安全的,至少对所有的

@RbMm来说可能是因为没有明确提到线程安全,并且OP没有意识到,在像Windows这样的抢占式多任务机中,如果API是线程不安全的,那么只会提到线程安全。线程安全必须是,而且是这样一个系统中的默认值。@AjayBrahmakshatriya:如果您对资源设置了锁,那么该锁需要进入您的锁层次结构(您确实有一个锁层次结构,对吗?)。锁层次结构很难正确实现,在维护系统时需要非常小心。通过将非线程安全的资源保持在线程本地,确保您不需要线程安全,这是目前最容易解决的问题。而且更容易维护。以前有一些关于线程安全的讨论。我不知道为什么会从MSDN中删除它,特别是因为至少还有一篇文章仍然引用它。不幸的是,它没有提到您的场景。@RbMm,如果您已经检查了代码,我相信您的话,但是我不清楚这个特定调用是否一定是线程安全的,因为它必须从公共状态获取PRNG种子。您确定使用同一句柄的两个同时调用可能不会返回相同的数据,或者返回微妙关联的数据,因此不适合加密使用吗?因此速度更快,这确实是UB,因为没有明确说明这种使用提供程序(状态)是安全和正确的。如果查找一些(我只从多个中随机查找一个)-可见关键部分在内部用于访问某些状态。但无论如何,没有什么可以证明。凭直觉,我想这将是非常安全的,非常感谢这个详细的分析和非常合理的推理。这使我很有信心,这个答案确实是正确的。谢谢