【问题标题】:HMAC with Cryptography API C/C++带有密码学 API C/C++ 的 HMAC
【发布时间】:2014-03-01 11:32:51
【问题描述】:

我正在使用来自 http://msdn.microsoft.com/en-us/library/aa382379(v=vs.85).aspx 的 Microsoft 示例。它编译得很好并且看起来工作,返回结果:

48 f2 57 38 29 29 43 16 fd f4 db 58 31 e1 0c 74 48 8e d4 e2

但是,当我使用下面的 C# 代码运行相同的计算时,我得到了不同的哈希值?

4C-2D-E3-61-BA-89-58-55-8D-E3-D0-49-ED-1F-B5-C1-15-65-6E-65

        HMAC hashMaker = new HMACSHA1(new byte[]{0x70,0x61,0x73,0x73,0x77,0x6F,0x72,0x64});
        byte[] hash = hashMaker.ComputeHash(new byte[] {0x6D,0x65,0x73,0x73,0x61,0x67,0x65});
        string hashStr = BitConverter.ToString(hash);

我担心示例 C 代码在某些方面是正确的。这里发生了什么?

【问题讨论】:

    标签: c++ c cryptography cryptoapi


    【解决方案1】:

    发布的 C# 代码和链接(但未发布)的 C 代码做不同的事情。因此,输出也会有所不同。

    WinCrypt 代码执行以下操作:

    • 创建密钥字节的 SHA1 哈希
    • 使用 RC4 从生成的哈希中派生会话密钥
    • 使用派生密钥初始化 HMAC_SHA1 摘要
    • 使用 HMAC 执行 HMAC CryptHashData
    • 请求生成的哈希字节

    C# 代码执行以下操作:

    • 使用密钥字节创建 HMAC_SHA1作为实际密钥(无派生)
    • 通过 ComputeHash 执行 HMAC,返回生成的哈希摘要

    换句话说,他们是不同的,因为他们在做不同的事情。哪一个是“正确的”取决于您要做什么(问题中没有提到)。

    OpenSSL 等效于 C# 代码

    unsigned char key[] = { 0x70,0x61,0x73,0x73,0x77,0x6F,0x72,0x64 };
    unsigned char bytes[] = { 0x6D,0x65,0x73,0x73,0x61,0x67,0x65 };
    unsigned char md[32] = {0};
    unsigned int md_len = (int)sizeof(md);
    
    HMAC_CTX ctx;
    HMAC_CTX_init(&ctx);
    HMAC_Init(&ctx, key, (int)sizeof(key), EVP_sha1());
    HMAC_Update(&ctx, bytes, sizeof(bytes));
    HMAC_Final(&ctx, md, &md_len);
    

    md 中生成的摘要分别与 C# 代码匹配(省略,但相信我的话或自己测试一下)。

    【讨论】:

    • 非常感谢您花时间回答问题。我试图直接做 HMAC sha1,没有推导。我确实想知道为什么会有一些 RC4 的东西,不认为那是 HAMC 的一部分。这似乎不可能与 wincrypt 做 CryptCreateHash 需要来自 CBC 块密码的密钥。 OpenSSL 示例看起来更加简洁明了!我有点 C++ 新手,所以可能很难链接等。wincrypt 很简单,因为它就在 VS 中,但 API 真的很难。
    • 我知道这是一篇旧帖子,但想对这个答案表示感谢。我花了很长时间试图调试为什么我的 Wincrypt HMAC 实现不起作用。最终,我采用了基于thisbcrypt 的实现。尽管如此,我还是很执着地不放过这些东西。我调查了为什么我的wincrypt 方法不起作用并怀疑是MSDN 示例中的RC4 步骤,这篇文章让我放心!
    【解决方案2】:

    我相信不可能使用 CryptoAPI CryptCreateHash 执行带有非派生密钥的 HMAC。

    但是,可以使用 Cryptography API: Next Generation (CNG) 中的 BCrypt 方法集来执行 HMAC SHA1/SHA256。示例见this question

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-09
      • 1970-01-01
      相关资源
      最近更新 更多