【问题标题】:HMAC SHA256 calculation on large file (using system call)大文件上的 HMAC SHA256 计算(使用系统调用)
【发布时间】:2020-09-01 03:05:06
【问题描述】:

我有以下代码来生成 SHA256 HMAC 哈希:

HMAC(EVP_sha256(), key, key_len, (const unsigned char *)data, strlen(data), digest, &digest_len);

不过,我想生成文件的 HMAC SHA256 哈希。请注意,该文件是一个大文件(~80 MB),我需要使用系统调用而不是直接使用 shell 命令来执行此操作。

问候

【问题讨论】:

  • fread()简单读取具体文件?系统调用到底是什么意思?
  • 我不想使用我的意思的 shell 命令。
  • 问题到底是什么?你不知道怎么读文件吗?您的可用内存是否受到限制,必须分成块?
  • 该文件约为 70MB 文件,那么如何一次性提供要散列的数据?我应该在迭代中读取文件并循环调用 HMAC( ) 吗?我不知道。因此问题

标签: c openssl cryptography sha256 hmac


【解决方案1】:

如果您有一个大文件,那么您可以使用HMAC_Update()HMAC_Final()。这是一个快速而肮脏的例子:

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <ssl/hmac.h>


int main(int argc, char *argv[])
{
    FILE *f;
    uint8_t buf[1024];
    HMAC_CTX *ctx;
    size_t ret;
    uint8_t key[8] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };
    uint8_t *md;
    int md_len;
    int i;

    if (argc < 2) {
        printf("Usage: %s [FILE]\n", argv[0]);
        return 1;
    }

    f = fopen(argv[1], "r");

    if (!f) {
        printf("Could not open file\n");
        return 1;
    }

    ctx = HMAC_CTX_new();
    HMAC_Init_ex(ctx, key, 8, EVP_sha256(), NULL);

    md = (uint8_t *) malloc(HMAC_size(ctx));

    while (!feof(f)) {
        ret = fread(buf, 1, sizeof(buf), f);
        HMAC_Update(ctx, &buf[0], ret);
    }

    HMAC_Final(ctx, md, &md_len);

    for (i = 0; i < md_len; i ++)
        printf("%02X", md[i]);

    printf("\n");
    HMAC_CTX_free(ctx);
    fclose(f);
    return 0;
}

输出:

$ ./hmac hmac
C477E7AA9EC9F0DD8C98F85B94A18BC954E0648BB0C7D302F5EDE3679A93A6E8
$

【讨论】:

  • 出于某种原因,使用此程序计算的哈希值与 Ubuntu 上可用的 hmac256 应用程序有时不匹配。我该如何调试呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
  • 2013-05-12
  • 2012-07-10
  • 1970-01-01
  • 2022-01-07
  • 2020-06-12
相关资源
最近更新 更多