【问题标题】:How to compute SHA1 of an array in Linux kernel如何在 Linux 内核中计算数组的 SHA1
【发布时间】:2013-05-27 12:20:01
【问题描述】:

我正在尝试在 Linux 内核中计算整数数组的 SHA1。我已经通过crypto.c/crypto.hsecurity/integrity/ima/ima_crypto.c,但我无法弄清楚如何init 然后update SHA1 计算机。有人可以向我指出如何执行此操作的教程或指南吗?

【问题讨论】:

    标签: linux-kernel cryptography sha1 digest


    【解决方案1】:

    Documentation/crypto/api-intro.txt 中对 linux 密码学 api 进行了很好的介绍。另请查看fs/ecryptfs/crypto.c,了解如何使用这些函数的真实示例。

    这里有一个简短的总结,让您开始:

    第 1 步:声明

    创建一些局部变量:

    struct scatterlist sg;
    struct hash_desc desc;
    char *plaintext = "plaintext goes here";
    size_t len = strlen(plaintext);
    u8 hashval[20];
    
    • struct scatterlist 用于以crypto.h 函数可以理解的格式保存明文,而struct hash_desc 用于配置散列。
    • 变量plaintext 保存我们的明文字符串,而hashval 将保存我们明文的哈希值。
    • 最后,len 保存明文字符串的长度。

    请注意,虽然我在此示例中使用 ASCII 明文,但您也可以传递一个整数数组 - 只需将总内存大小存储在 len 中,然后用您的整数替换 plaintext 的每个实例数组:

    int myarr[4] = { 1, 3, 3, 7 };
    size_t len = sizeof(myarr);
    

    但请注意:int 元素的大小通常大于一个字节,因此将整数值存储在int 数组中不会具有与char 数组相同的内部表示形式——您可以结束在值之间添加空字节作为填充。

    此外,如果您打算散列整数的 ASCII 表示,您必须首先将数组中的值转换为字符串字符序列(可能使用sprintf)。

    第 2 步:初始化

    初始化sgdesc

    sg_init_one(&sg, plaintext, len);
    desc.tfm = crypto_alloc_hash("sha1", 0, CRYPTO_ALG_ASYNC);
    

    注意"sha1" 被传递给crypto_alloc_hash;这可以设置为 "md5" 用于 MD5 散列,或任何其他受支持的字符串,以便使用相应的散列方法。

    第 3 步:散列

    现在使用三个函数调用执行散列:

    crypto_hash_init(&desc);
    crypto_hash_update(&desc, &sg, len);
    crypto_hash_final(&desc, hashval);
    
    • crypto_hash_init 根据提供的struct hash_desc 配置哈希引擎。
    • crypto_hash_update 对明文执行实际的散列方法。
    • 最后,crypto_hash_final 将哈希复制到一个字符数组中。

    第 4 步:清理

    desc.tfm 持有的空闲分配内存:

    crypto_free_hash(desc.tfm);
    

    另见

    how to use CryptoAPI in the linux kernel 2.6

    【讨论】:

    • 非常感谢您提供非常详细的答案(以及自定义)。我会尽快处理并提供反馈。
    • 我不明白sizeof(myarr) * sizeof(*myarr); 背后的基本原理。 sizeof(myarr) 会给你 16(假设 32 位整数),sizeof(*myarr) 会给你 4。如果你将它们相乘,它会得到 64,这绝对不是你数组的大小。
    • @tangrs 哎呀,好像我犯了一个错误(你只需要sizeof(myarr));我会在答案中纠正它。
    • crypto_hash_final()的输出是20字节的二进制,不是十六进制的ASCII,所以hashtext的大小应该是20,而不是41。
    • @WuYongzheng 感谢您发现该错误;我现在更新了答案以反映正确的 20 字节二进制大小。
    猜你喜欢
    • 2013-01-06
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    相关资源
    最近更新 更多