【发布时间】:2018-09-14 02:36:16
【问题描述】:
我有这个代码:
string HMACsha256(string message, string APIkey){
// The secret key for hashing
char key[APIkey.length() + 1];
strcpy(key, APIkey.c_str());
// The data that we're going to hash
char data[message.length() + 1];
strcpy(data, message.c_str());
unsigned char* result;
unsigned int len = 64;
result = (unsigned char*)malloc(sizeof(char) * len);
HMAC_CTX ctx;
HMAC_CTX_init(&ctx);
HMAC_Init_ex(&ctx, key, strlen(key), EVP_sha256(), NULL);
HMAC_Update(&ctx, (unsigned char*)&data, strlen(data));
HMAC_Final(&ctx, result, &len);
HMAC_CTX_cleanup(&ctx);
printf("HMAC digest: ");
string signature; // <-------- I want to store the values from the printf with result in the loop below in this
for (int i = 0; i != len; i++){
printf("%02x", (unsigned int)result[i]); //<--- I want this in signature string
}
cout << endl<< "SIG: " << signature << endl;
free(result);
return signature;
}
关于它的一切工作正常,除了我需要能够将结果作为字符串返回。我一直无法想出一种方法来从 unsigned char* 结果变量中获取十六进制数据并将其存储到签名字符串中。有谁知道我该怎么做?
编辑:这个问题被标记为与convert a char* to std::string 重复 但是,我已经在那个线程上尝试了例外的答案
const char *s = "Hello, World!";
std::string str(s);
使用我的代码,它看起来像:
string signature(result);
像这样运行我的代码会产生这个错误:
error: no matching constructor for initialization of 'string' (aka 'basic_string<char, char_traits<char>, allocator<char> >')
string signature(result);
与
string signature(reinterpret_cast<char*>(result));
结果是:
Result:
20ef96358c199befc0a0e6de47170734532e48e7ddfbf4ea48ef207989342677
Signature:
?5???????G4S.H?????H? y?4&w?Ήf?
我注意到我“不想将数据按原样转换为字符串,而是转换为十六进制表示”,如果这样可以让任何人更清楚地了解这个问题。
【问题讨论】:
-
是的。我已经尝试了我刚刚在上面编辑的解决方案,字符串流和分配。以前发布的解决方案不能与我的代码一起编译,或者它会产生垃圾随机值作为结果。
-
您传递的任何函数
result是否在末尾添加空终止符?否则试试return std::string(result, result + len);。 -
@runesbane 抱歉,我没有注意到
unsigned,这很重要。请参阅此副本:stackoverflow.com/questions/17746688/… -
旁白:因为 len 是编译时间常数;您可能更喜欢使用数组;标准::数组;或 std::vector 来保存你的角色。这样,如果您在 free 之前抛出异常,您就不会发生泄漏
-
@user2079303 我也尝试了该解决方案,它在签名中产生垃圾结果:HMAC 摘要:20ef96358c199befc0a0e6de47170734532e48e7ddfbf4ea48ef207989342677