对一个字符串进行HMAC SHA256编码

3

我该如何使用HMAC SHA256算法对字符串进行编码?我查阅了OpenSSL库,但没有找到有价值的东西。你有什么建议吗?


1
“anything valuable” 是什么意思?https://www.openssl.org/docs/crypto/sha.html,https://www.openssl.org/docs/crypto/hmac.html 列出了各种方法。 - Martin R
@MartinR,我所说的有价值的东西是指任何有价值的东西。这样满足你了吗? - user266003
@MartinR 这份文档对新手不是很友好,但其他加密库似乎也是这样。Bouncy Castle比OpenSSL更简略一些,但对于初学者来说,它的文档可能仍然像密文一样难以理解。 :-) - Jeffrey Hantin
1
@JeffreyHantin:当然。但是在我看来,“没有找到任何有价值的东西”太过笼统,甚至没有表明OP找到了什么以及他/她尝试让它工作的情况。 - Martin R
1
你在谈论什么编码?HMAC生成的身份验证标签是不可逆的,因此它不是一种编码。 - Artjom B.
1个回答

11

HMACSHA256是OpenSSL中的不同组件,您需要自行将它们粘合在一起。(请注意,此处使用了快捷方法,可以使用单块缓冲区完成所有操作;增量处理更为复杂。)

#include <openssl/evp.h>
#include <openssl/hmac.h>

unsigned char* hmac_sha256(const void *key, int keylen,
                           const unsigned char *data, int datalen,
                           unsigned char *result, unsigned int* resultlen)
{
    return HMAC(EVP_sha256(), key, keylen, data, datalen, result, resultlen);
}

即使您的输入是一个字符串,结果也是一个任意字节数组;如果它也需要是一个字符串,那么您就需要应用一些其他的转换,比如十六进制扩展、Base64或适合您应用程序的任何东西。


你的参数类型需要改进。数据长度应该是 size_t,而 resultlen 应该是 unsigned int 并通过地址传递。 - WhozCraig
在传递 resultlen 时使用地址是个好主意。HMAC 的链接文档页面指定了密钥和数据长度的类型为 int 而不是 size_t,而缓冲区指针和长度类型之间的一般缺乏类型一致性有点令人困惑,如果不是代码中的明显问题的话。 - Jeffrey Hantin
如果它说是' int',那就可能是错的(OpenSSL出了问题不是第一次了)。我检查了头文件,虽然我的OpenSSL版本有点旧,但我觉得很奇怪会那样改变。我之所以记得只是因为这是我遇到的仅有的一个将三种不同数据长度传递给三种不同类型的功能:size_t,int和无符号int(后者通过地址传递)。我认为这很奇怪。 - WhozCraig
从我的设备上看:unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len, const unsigned char *d, size_t n, unsigned char *md, unsigned int *md_len)。就像我说的,很奇怪。最后一个才是真正重要的,至少在你的和我的代码中都是一样的,所以这没什么关系。 - WhozCraig
HMAC和SHA256的链接似乎已经失效。 - chux - Reinstate Monica
@chux 现在应该已经修复了 - 在 Wayback Machine 上找到了一份副本。 - Morten Jensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接