CryptGenRandom() 对于单个全局程序范围的 HCRYPTPROV 实例来说是线程安全的吗?
MSDN 似乎缺乏这方面的任何信息:https://msdn.microsoft.com/en-us/library/windows/desktop/aa379942(v=vs.85).aspx
为每个线程创建一个单独的 HCRYPTPROV 并再次销毁它会使事情变得非常复杂(并且还可能在我这边带来更多与安全相关的错误),因此了解这一点非常有用。共享一个全局 HCRYPTPROV 肯定会容易得多。
那么这里有人知道 CryptGenRandom() 的线程安全性吗,特别是对于单个 HCRYPTPROV 实例?
创建一个单独的HCRYPTPROV
每个线程没有多大意义。在所有当前实现中,这是指向堆中内存块的指针,主要保存指向CSP 入口点它用于调用实际的提供程序实现(CPGenRandom
在我们的例子中)。参考文献本身不包含state of the CSP,与例如HCRYPTKEY
其中包含实际的密钥状态。所以即使你创建一个单独的HCRYPTPROV
对于每个线程 - 这不会改变任何内容。
可能有一些全局变量/数据被使用CSP本次通话期间内部;然而,这是未知的,因为这些将是实施细节。当然我们可以将调用序列化CryptGenRandom
在代码中。但是我们无法控制进程中的其他 dll 也调用CryptGenRandom
同时。因此将所有调用序列化为CryptGenRandom
也是不可能的。
结果我认为CPGenRandom
必须设计为线程安全的。根据我对著名 Microsoft CSP 的测试,这是真的。内部同步用于函数中,当需要访问全局数据并且多个线程调用时CPGenRandom
同时;每个线程接收唯一的随机数据。
所以我的结论是——CryptGenRandom
是线程安全的,至少对于所有人而言微软云服务提供商
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)