ESP32 Huzzah32 Feather中SHA256结果Base64编码不符预期求助
问题分析与解决
你的核心错误是混淆了哈希值的二进制原始数据和十六进制字符串表示:
- 你代码里的
shaResult是SHA256哈希的二进制原始数据(32字节的字节数组),对它做Base64编码得到的FjXIUlr7rljDe+3jyUQIROkUNyfMfBYL7WZew3jYomI=是完全正确的。 - 你预期的Base64结果,其实是把哈希值的十六进制字符串(也就是你打印出来的
1635c8525afbae58c37bede3c9440844e9143727cc7c160bed665ec378d8a262)当成原始数据进行Base64编码后的产物,这和你当前代码的操作逻辑完全不同。
两种处理方案
方案1:获取你预期的Base64结果
如果确实需要得到你想要的那个Base64字符串,需要先把二进制哈希值转换成十六进制字符串,再对这个字符串做Base64编码。修改后的代码如下:
#include "mbedtls/md.h" #include "mbedtls/base64.h" void setup(){ Serial.begin(115200); char *payload = "ABCD1234"; byte shaResult[32]; mbedtls_md_context_t ctx; mbedtls_md_type_t md_type = MBEDTLS_MD_SHA256; const size_t payloadLength = strlen(payload); mbedtls_md_init(&ctx); mbedtls_md_setup(&ctx, mbedtls_md_info_from_type(md_type), 0); mbedtls_md_starts(&ctx); mbedtls_md_update(&ctx, (const unsigned char *) payload, payloadLength); mbedtls_md_finish(&ctx, shaResult); mbedtls_md_free(&ctx); // 将二进制哈希值转换为十六进制字符串 char hexStr[65]; // 32字节*2位十六进制 + 1个终止符 for(int i = 0; i < sizeof(shaResult); i++){ sprintf(&hexStr[i*2], "%02x", (unsigned int)shaResult[i]); } hexStr[64] = '\0'; // 确保字符串以空字符结尾 Serial.println(hexStr); // 对十六进制字符串执行Base64编码 unsigned char output[90]; // 预留足够空间存储Base64结果 size_t outlen = sizeof(output); mbedtls_base64_encode(output, sizeof(output), &outlen, (unsigned char *)hexStr, strlen(hexStr)); output[outlen] = 0; Serial.println((const char*)output); } void loop(){}
方案2:保留正确的二进制哈希Base64编码
如果你原本的需求就是对SHA256的二进制结果做Base64编码,那你当前代码的输出是完全正确的,不需要修改——这也是大多数加密场景下的标准做法,因为二进制数据的Base64编码比十六进制字符串的编码更紧凑。
内容的提问来源于stack exchange,提问作者JonathanAskey
相关产品推荐
相关产品推荐

