• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

md5 на ESP32 делюсь опытом

p-a-h-a

Member
Не нашел такой темы на рунете, братья китайцы подсказали. (Первоисточник)
На Ардуино выглядит так:
C++:
#include "rom/md5_hash.h" // для void md5_test
#include "mbedtls/md5.h" // для void mbed_tls_md5

int i, ret = 0;
unsigned char mbedtls_md5sum[16];
unsigned char content[] = "admin"; // Строка, md5 которой будем вычислять

void setup(){
  Serial.begin(115200);
  }
void md5_test(unsigned char *content) {
  struct MD5Context md5;
  MD5Init(&md5);
  unsigned char hash[17]="";
    
    MD5Update(&md5, content, strlen((const char *)content));
    MD5Final(hash,&md5);
    Serial.printf("\r\n************** MD5 Digest*******************\r\n");
    for (i = 0; i < 16; i++)// В исходнике было 17 вместо 16 и выписывало лишних два ноля
    {
        Serial.printf("%02x",hash[i]);
    }
}

void mbed_tls_md5(unsigned char *content,unsigned char *mbedtls_md5sum)
{
    ret = mbedtls_md5_ret(content, strlen((const char *)content), mbedtls_md5sum);
    if( ret != 0 )
        Serial.printf( "mbedtls_md5_ret() failed\n" );
    else
    {
        Serial.printf("\r\n************ mbedtls_md5_ret result ****************\r\n");
        for (i = 0; i < 16;i++)
        {
            Serial.printf("%02x", mbedtls_md5sum[i]);
        }
    }
}

void loop(){
    md5_test(content);
    mbed_tls_md5(content, mbedtls_md5sum);
    Serial.printf("\r\n************* END **************");
    fflush(stdout);
    delay(5000);
    }
В Serial:
Код:
************** MD5 Digest*******************
21232f297a57a5a743894a0e4a801fc3
************ mbedtls_md5_ret result ****************
21232f297a57a5a743894a0e4a801fc3
************* END **************
 

p-a-h-a

Member
Один вопросик к знающим строки: как заменить
C++:
unsigned char hash[17]="1";
Serial.printf("%02x",hash);
на:
C++:
String MD5 = sprintf("%02x",hash); // Не работает
Пока так выкрутился:
C++:
if (hash<0x10) MD5 +="0";
MD5 += String(hash,HEX);
 

p-a-h-a

Member
Для себя доделал рабочий вариант MD5 отдающий строку хеша. Конечный результат:
C++:
#include <WiFi.h>
#include "mbedtls/md5.h"
#define  Login "admin"
#define  Password "123456"
void setup() {
  Serial.begin(115200);
  String uuid = MD5(WiFi.macAddress());
  String hash = MD5(MD5(Login) + MD5(Password));
  Serial.println(uuid);
  Serial.println(hash);
}

String MD5(String buf) { 
  unsigned char content[64], mbedtls_md5sum[16]; // 64 - максимальный размер буфера принимаемой строки
  for (int i = 0; i < buf.length(); i++) {
    content[i] = buf.charAt(i);
  } String MD5;
  int ret = mbedtls_md5_ret(content, buf.length(), mbedtls_md5sum);
  for (byte i = 0; i < 16; i++) {
    if (mbedtls_md5sum[i] < 0x10) MD5 += "0";
    MD5 += String(mbedtls_md5sum[i], HEX); //Serial.printf("%02x", mbedtls_md5sum[i]);
  } return MD5;
}

void loop() {}
В Serial:
Код:
6584917566d2f82d14a711f67154f531
a8f283efb0a7639652c9f09012f43cbb
 
Сверху Снизу