之前不太了解arduino,使用第三方md5库加密。
https://github.com/tzikis/ArduinoMD5https://github.com/tzikis/ArduinoMD5
#include "MD5.h"
//houyawei 2021.10.29
unsigned char* hash = MD5::make_hash((char *)md.c_str());
char *test = MD5::make_digest(hash, 16);
printf("test:%s\r\n",test);
生产环境遇到了问题,加密次数过多会导致esp32概率性崩溃,无法在程序内修复,只能看门狗重启或断电重启恢复。此异常导致串口不断有错误数据。
注意readme,循环调用的时候加free指针后,程序正常(最新编辑内容)
unsigned char* hash=MD5::make_hash("hello world");
//generate the digest (hex encoding) of our hash
char *md5str = MD5::make_digest(hash, 16);
//print it on our serial monitor
Serial.println(md5str);
//Give the Memory back to the System if you run the md5 Hash generation in a loop
free(md5str);
//free dynamically allocated 16 byte hash from make_hash()
free(hash);
之后看到arduino_esp32库里面自带md5加密算法的。
#include "MD5Builder.h"
MD5Builder md5;
md5.begin();
md5.add(md);
md5.calculate();
//const char *md5str = md5.toString().c_str();
//printf("%s\r\n",md5str);
//houyawei
使用官方算法后没有再遇到而esp32异常的问题。
参考链接:
https://github.com/esp8266/Arduino/issues/1349https://github.com/esp8266/Arduino/issues/1349
---------houyawei 2021.10.29
补:
之后直接在esp-idf使用md5加密,了解到乐鑫esp-idf框架集成开源的 mbedtls 加密库
以下测试可使用
printf("MD5 加密\n");
mbedtls_md5_context md5_ctx;
unsigned char encrypt[] = "hello_worled1234";
unsigned char decrypt[16];
mbedtls_md5_init(&md5_ctx);
mbedtls_md5_starts_ret(&md5_ctx);
mbedtls_md5_update_ret(&md5_ctx, encrypt, strlen((char *)encrypt));
mbedtls_md5_finish_ret(&md5_ctx, decrypt);
printf("MD5加密前:[%s]\n", encrypt);
printf("MD5加密后(32位):");
for(int i = 0; i < 16; i++)
{
printf("%02x", decrypt[i]);
}
printf("\r\n");
mbedtls_md5_free(&md5_ctx);
//houyawei
当然也可以参考arduino-esp32项目内的方法写
string md5str(string &in){
char out[33] = {0};
mbedtls_md5_context _ctx;
uint8_t i;
uint8_t * _buf = (uint8_t*)malloc(16);
if(_buf == NULL)
return string(out);
memset(_buf, 0x00, 16);
mbedtls_md5_init(&_ctx);
mbedtls_md5_starts_ret(&_ctx);
mbedtls_md5_update_ret(&_ctx, (const uint8_t *)in.c_str(), in.length());
mbedtls_md5_finish_ret(&_ctx, _buf);
for(i = 0; i < 16; i++) {
sprintf(out + (i * 2), "%02x", _buf[i]);
}
out[32] = 0;
free(_buf);
return string(out);
}
//使用
string key = md5str(md);
参考:
https://github.com/espressif/arduino-esp32/blob/master/libraries/WebServer/src/WebServer.cpphttps://github.com/espressif/arduino-esp32/blob/master/libraries/WebServer/src/WebServer.cpp -------houyawei2021.12.09