Microsoft says:
CryptEncrypt
函数不保证是线程安全的,如果多个调用者同时调用,可能会返回错误的结果。
这是否意味着该功能会修改全局数据? 或者它只是意味着你不能同时使用相同的哈希/密钥?
(换句话说,下面的评论是否正确?)
答案 0 :(得分:1)
这意味着它意味着:该函数不保证是线程安全的。 它可能有一个内部静态(或全局)状态,但这是一个实现细节。
您是否使用相同的散列或密钥是无关紧要的。
评论后编辑:根据this MSDN page,由于内部密钥状态,CryptoApi密钥句柄不是线程安全的:
大多数算法和模式都要求以与加密相同的顺序对数据进行解密。这在多线程环境中是一项艰巨的任务,因为使用临界区不会解决排序问题。如果在ECB密码模式下使用分组密码(即RC2,DES或3DES),则此问题不是因素,因为内部密钥状态不会更改。但是,ECB不是默认的密码模式。 CBC是默认的密码模式。使用CBC密码模式,内部密钥状态确实会发生变化。
毕竟, 似乎有理由认为如果他们不共享相同的密钥,你确实可以在几个线程上使用CryptEncrypt
。不过,这只是猜测。
答案 1 :(得分:0)
我认为这意味着您无法同时分叉多个进程来使用它,因为该函数使用共享地址空间。它可以访问所有线程的内存,因此会给你意想不到的结果。如果您的应用程序正在执行此操作,这应该只是多线程的问题。