将Openssl HMAC SHA256 32字节输出转换为64字节字符串

cgvd09ve  于 2023-02-03  发布在  Mac
关注(0)|答案(1)|浏览(217)

我使用OpenSSL的HMAC SHA256接口来散列字符串:

unsigned char* res = HMAC(EVP_sha256(), key, key_len, data, data_len, result, result_len);

得到的散列值'result_len'的大小是32字节,但是,我正在编程的接口要求SHA256散列值是64字节。
我找到了这个代码片段,循环经过散列输出缓冲区并打印每个字节:

for (unsigned int i = 0; i < result_len; i++)
{
    printf("%02hhX", result[i]);
}

https://stackoverflow.com/a/62458287/21129211
上面的代码输出了我所期望的64字节(所以哈希是正确的)。
然而,我想把缓冲区转换成64字节,作为一个字符串。当我从这里搜索和使用base 64 decode(和encode)函数时:
https://stackoverflow.com/a/41094722/1107474
不幸的是,返回的字符串(编码和解码)与预期的64字节值没有任何相似之处。
如何将printf()输出转换为64字节字符串?

tvmytwxo

tvmytwxo1#

@dbush评论:

char buf[ 64 + 1 ];
char *at = buf;

for (unsigned int i = 0; i < result_len; i++)
{
    at += sprintf( at, "%02hhX", result[i] );
}

puts( buf ); // only for debugging purposes.

您可以研究合并字节(位移位)以减少对sprintf()的调用,这需要了解架构的字节序。

    • 编辑**

还有一个标准的轻量级版本可以将字节转换为十六进制。不要忘记在循环结束后终止字符串。

char buf[ 64 + 1 ];
char *at = buf;
char *hex = "0123456789ABCDEF";
for (unsigned int i = 0; i < result_len; i++)
{
    unsigned char c = result[i];
    *at++ = hex[ c >>   4 ];
    *at++ = hex[ c &  0xF ];
}
*at = '\0';

相关问题