如何在Windows上计算HMAC SHA?

时间:2011-08-06 18:19:21

标签: windows hmac sha

我需要在Windows上的程序中计算HMAC SHA。这个程序早先用于在linux上运行,它使用的是openssl。现在我需要将它移植到Windows,但我不确定Windows平台SDK是否提供了计算HMAC SHA的任何方法。

我浏览msdn上的以下链接,但我不确定 - http://msdn.microsoft.com/en-us/library/aa382453(v=VS.85).aspx

让我知道对我来说最好的方法是什么。现有的计划在C。

3 个答案:

答案 0 :(得分:2)

如果您明确地拥有密钥,则可能更容易从两个SHA原语调用中明确地编程HMAC,而不是尝试使Windows密码API知道密钥。 HMAC本身在RFC 2104中指定,Windows可以使用CryptCreateHash,CryptHashData和CryptGetHashParam为您执行SHA哈希。

答案 1 :(得分:2)

您可以使用CryptImportKey将密钥输入Windows加密服务提供商。然后按照MSDN example HMAC代码。将密钥输入CSP的技巧是使结构包含3个内容:BLOBHEADER,长度为DWORD,密钥为char []。我假设您有原始密钥数据,所以它看起来像:

struct KeyData
{
  BLOBHEADER hdr;
  unsigned long keyLength;
  unsigned char key[128];
};

void ComputeHash()
{
  HCRYPTPROV cryptoProvider = 0;
  HCRYPTKEY cryptKey = 0;
  KeyData kd;
  kd.hdr.aiKeyAlg = CALG_RC2;
  kd.hdr.bType = PLAINTEXTKEYBLOB;
  kd.hdr.bVersion = CUR_BLOB_VERSION;
  kd.hdr.reserved = 0;
  kd.keyLength = 128;
  /* set your key data here */
  /* get a crypto provider - See the microsoft references */
  CryptImportKey(cryptoProvider, reinterpret_cast<BYTE*>(&kd), sizeof(kd),0, CRYPT_IPSEC_HMAC_KEY, &cryptKey);
  /* use cryptKey in the call to CryptCreateHash when you create your CALG_HMAC */
}

确保将长度替换为您的钥匙的实际长度。

答案 2 :(得分:0)

如果您想使用操作系统中包含的API,那么您找到的链接就可以了 - 更多信息请参阅http://msdn.microsoft.com/en-us/library/aa380255%28v=vs.85%29.aspx

或者您正在寻找具有某些特定功能的第三方库?如果您已经熟悉openssl,它也适用于Windows ...请参阅http://www.slproweb.com/products/Win32OpenSSL.html