如何使用 OpenSSL 计算 SHA512/224 和 SHA512/256 哈希?

Posted

技术标签:

【中文标题】如何使用 OpenSSL 计算 SHA512/224 和 SHA512/256 哈希?【英文标题】:How to calculate SHA512/224 and SHA512/256 hashes using OpenSSL? 【发布时间】:2018-06-07 14:23:05 【问题描述】:

这是我在 C 中计算 SHA512 哈希的方法。

#include <openssl/sha.h>
#include <stdio.h>

char *calc_sha512(char *data) 
    SHA512_CTX ctx;
    char *md = malloc(sizeof(char)*(SHA512_DIGEST_LENGTH+1));

    SHA512_Init(&ctx);
    SHA512_Update(&ctx, data, strlen(data));
    SHA512_Final(md, &ctx);
    md[SHA512_DIGEST_LENGTH] = '\0';

    return md;


int main() 
    printf("%s\n", calc_sha512("foo"));

    return 1;

现在,当我尝试将其转换为 512/t(512/224 或 512/256)时,它不起作用。我最初认为要计算 512/t 哈希,您只需将输出截断为 t 位,但在进一步阅读后,它不仅截断输出,它还有不同的初始常数值。所以我试图找出支持它的 OpenSSL 中的任何功能?到目前为止,我已经查看了文档和头文件,在 SHA 或 EVP 下都找不到这种方法。 OpenSSL 是否甚至支持 SHA512/t 哈希算法?它是否提供开箱即用的功能?任何指向它的指针都会有所帮助。

【问题讨论】:

另见 Kelsey 关于截断散列的讨论。他们并没有减少证明来自 SHA-1 和 SHA-2 系列的截断哈希与完整大小的哈希具有相同的安全性。 Cryptographic Hash Workshop (2005) - Truncation Mode for SHA. return md 可能会中断,因为哈希可能会嵌入 NULL。或者它不会在你期望的地方有一个 NULL 。您是否意识到它是二进制字符串而不是 ASCIIZ 字符串?另请参阅Calculate and print SHA256 hash of a file using OpenSSL、How to print SHA512 hash in C、Generate SHA hash in C++ using OpenSSL library(和朋友)。 @jww 这是我脑子里想出来的东西,我不希望它按照它写的方式运行。我试图在 C 中使用 OpenSSL 实现类似 this 的东西。我在 API 中找不到任何东西。有没有办法我甚至可以在 C 中手动做到这一点? “我有没有办法在 C 语言中手动做到这一点” - 做什么? OpenSSL 具有 SHA-1 到 SHA-512。链接的问题向您展示了如何做到这一点。 【参考方案1】:

正如您所注意到的,那些截断的 sha512 哈希使用不同的初始化向量,如果它们只是从字面上截断这些字节,可能是为了避免泄露部分实际 sha512 哈希。

几个月前在 OpenSSL 主树中实现了对 sha512_256 的支持,并且可能会在 OpenSSL 1.1.1 中实现。

检查更新日志: https://www.openssl.org/news/changelog.txt

或者在 Github 上的提交: https://github.com/openssl/openssl/commit/4bed94f0c11ef63587c6b2edb03c3c438e221604

...因此,根据您所使用的平台,您可以在不久的将来使用这些新功能,就像您使用您提供的 sha512 示例一样。

【讨论】:

以上是关于如何使用 OpenSSL 计算 SHA512/224 和 SHA512/256 哈希?的主要内容,如果未能解决你的问题,请参考以下文章

5.openssl dgst

如何使用 sha512 为 JWT 生成 RSA 密钥?

openssl dgst(生成和验证数字签名)

在HMAC SHA256中编码字符串[关闭]

为啥我使用 OpenSSL 和 Java 生成的 RSA-SHA256 签名不同?

openssl evp 哈希算法(md5,sha1,sha256)