我需要在 Windows 上的程序中计算 HMAC SHA。该程序之前用于在使用 openssl 的 linux 上运行。现在我需要将它移植到 Windows,但我不确定 Windows 平台 SDK 是否提供任何方法来计算 HMAC SHA。
我在 msdn 上浏览了以下链接,但我不确定 - http://msdn.microsoft.com/en-us/library/aa382453(v=VS.85).aspx。
让我知道对我来说最好的方法是什么。现有程序在 C 中。
我需要在 Windows 上的程序中计算 HMAC SHA。该程序之前用于在使用 openssl 的 linux 上运行。现在我需要将它移植到 Windows,但我不确定 Windows 平台 SDK 是否提供任何方法来计算 HMAC SHA。
我在 msdn 上浏览了以下链接,但我不确定 - http://msdn.microsoft.com/en-us/library/aa382453(v=VS.85).aspx。
让我知道对我来说最好的方法是什么。现有程序在 C 中。
您可以使用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 */
}
确保将长度替换为密钥的实际长度。
如果您明确拥有密钥,那么通过两次调用 SHA 原语来明确编程 HMAC 可能比尝试让 Windows 加密 API 知道密钥更容易。HMAC 本身在 RFC 2104 中指定,Windows 可以使用 CryptCreateHash、CryptHashData 和 CryptGetHashParam 为您执行 SHA 哈希。
如果您想使用操作系统中包含的 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