1

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

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

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

4

3 回答 3

3

您可以使用CryptImportKey您的密钥进入 Windows 加密服务提供程序。然后按照MSDN 示例 HMAC代码进行操作。将密钥放入 CSP 的技巧是创建一个结构来保存 3 个内容: a BLOBHEADER, aDWORD用于长度, 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 
     This example selects "Microsoft AES Cryptographic Provider"
     which supports SHA-256
  */
  CryptAcquireContext(&cryptoProvider, NULL, MS_ENH_RSA_AES_PROV, PROV_RSA_AES, CRYPT_VERIFYCONTEXT);

  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 */
}

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

于 2015-09-03T00:03:57.383 回答
2

如果您明确拥有密钥,那么通过两次调用 SHA 原语来明确编程 HMAC 可能比尝试让 Windows 加密 API 知道密钥更容易。HMAC 本身在 RFC 2104 中指定,Windows 可以使用 CryptCreateHash、CryptHashData 和 CryptGetHashParam 为您执行 SHA 哈希。

于 2011-08-06T18:30:57.167 回答
0

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

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

于 2011-08-06T18:26:24.290 回答