Windows加密API是否因为调试程序附加到进程而故意运行得更慢?

时间:2015-08-25 15:29:09

标签: c++ c winapi hmac cryptoapi

在我的Windows应用程序中,我需要对密码实施PBKDF2加密。为此,我需要多次使用SHA-256计算HMAC。因此,对于一轮我称之为以下API序列:

//For simplicity I'm not posting the full code
//One can look up implementation of HMAC/SHA-256 in C
CryptAcquireContext(, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_NEWKEYSET);
CryptImportKey(, , 0, CRYPT_IPSEC_HMAC_KEY, );
CryptCreateHash(, CALG_HMAC, , 0, );
CryptSetHashParam(, HP_HMAC_INFO, , 0);
CryptHashData(, , , 0);
CryptGetHashParam(, HP_HASHVAL, NULL, , 0);
CryptGetHashParam(, HP_HASHVAL, , , 0);

根据PBKDF2规范,可以在某种循环中调用此序列10,000次以上。

我开始注意到,如果我通过Ctrl + F5(在Visual Studio中)运行此序列,或者没有调试器,它会在我的笔记本电脑上执行大约不到1秒。但是,如果我将一个调试器附加到该进程,它运行速度很慢 - 有时接近10秒左右。 (在这种情况下的时间也不一致。)

所以我认为这是因为调试器构建而发生的。所以我尝试构建一个发布版本,然后附加一个调试器。令我惊讶的是,它也运行缓慢。

所以我很好奇,那些加密API中是否有某些内容会使调试器连接得慢?

1 个答案:

答案 0 :(得分:1)

  

我刚试过它,如果我将Visual Studio调试器附加到我的运行过程中,它似乎不会发生。

然后它取决于Windows调试堆(不要与CRT调试堆混淆,后者完全不相关并且在调试模式下被激活):

  

调试器创建的进程使用特殊的调试堆,而不是使用标准堆API。您可以使用_NO_DEBUG_HEAP环境变量或-hd命令行选项强制生成的进程使用标准堆而不是调试堆。

https://msdn.microsoft.com/en-us/library/windows/hardware/hh406274%28v=vs.85%29.aspx

有关更详细的说明和一些基准,请参阅here