0

微软

CryptEncrypt函数不能保证是线程安全的,并且如果被多个调用者同时调用,可能会返回不正确的结果。

这是否意味着该函数修改了全局数据?
还是仅仅意味着您不能同时使用相同的哈希/键?

(换句话说,下面的评论是否正确?)

4

2 回答 2

1

这意味着它的含义:函数不能保证是线程安全的它可能具有内部静态(或全局)状态,但这是一个实现细节。

是否使用相同的哈希或密钥是无关紧要的。


评论后编辑:根据此 MSDN 页面,由于内部密钥状态,CryptoApi 密钥句柄不是线程安全的:

大多数算法和模式都要求数据以与加密相同的顺序进行解密。这在多线程环境中是一项艰巨的任务,因为使用临界区不会解决排序问题。如果您在 ECB 密码模式下使用分组密码(即 RC2、DES 或 3DES),则此问题不是一个因素,因为内部密钥状态不会改变。但是,ECB 不是默认密码模式。CBC 是默认密码模式。使用 CBC 密码模式,内部密钥状态会发生变化。

所以毕竟,如果它们不共享相同的密钥,那么认为您确实可以在多个线程上使用它们似乎是合理的。CryptEncrypt不过,这只是一个猜测。

于 2012-05-29T22:34:53.897 回答
0

我相信这意味着您不能同时分叉多个进程来使用它,因为该函数使用共享地址空间。它可以访问所有线程的内存,因此会给您带来意想不到的结果。如果您的应用程序正在这样做,这应该只是多线程的问题。

于 2012-05-29T22:28:40.140 回答