MD5 хэширование строки в C - PullRequest
0 голосов
/ 11 мая 2019

В настоящее время я пытаюсь объединить две строки в C, используя следующую библиотеку MD5: https://openwall.info/wiki/people/solar/software/public-domain-source-code/md5

Однако, когда я запускаю свой код (он компилируется без предупреждений), возникает ошибка памяти (segfaultили что-то подобное).

Где ошибка?Кто-нибудь может указать мне правильное направление?

Код:

#include "md5.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

char* hashfunc (char* word1, char* word2){
    //concat both words
    strncat(word1,word2,100);
    MD5_CTX md5;
    MD5_Init(&md5);
    MD5_Update(&md5,word1,strlen(word1));
    unsigned char* digest;
    MD5_Final(digest,&md5);

    return digest;
}

int main(){
    char* a = "dick";
    char* b = "duenn";

    char* ret = hashfunc(a,b);
    printf("MD5 hash: %s\n",ret);
}

Заранее спасибо.

1 Ответ

2 голосов
/ 11 мая 2019

Вероятно, одним из самых больших неудобств C является обработка строк. Это все очень низкий уровень. char* - это не просто строка, которую можно изменить и записать; это просто указатель на память.

Есть несколько способов исправить код, но вот мое рекомендуемое исправление:

// hashes two words and writes the digest to output.
void hashfunc(char* word1, char* word2, char* output) {
    //concat both words
    char concat[100];
    strcpy(concat, word1);
    strcat(concat, word2);

    MD5_CTX md5;
    MD5_Init(&md5);
    MD5_Update(&md5,concat,strlen(concat));
    MD5_Final(output,&md5);
}

Изменения были:

  • Использование временного рабочего буфера для объединения слов в хэши.
  • Не возвращает значение, вместо этого он разрешает пользователю передавать буфер для обработки возвращаемого значения.

Преимущество второго изменения заключается в том, что потребитель может использовать память в стеке, а не всегда вынужден иметь дело с распределением памяти внутри функции. (Другой метод заключается в том, чтобы malloc памяти и возвращать ее, которая медленнее и должна быть освобождена вручную).

Также я не совсем уверен, как работает используемая вами библиотека MD5, но вы, вероятно, можете вообще избежать ручной конкатенации:

void hashfunc(char* word1, char* word2, char* output) {
    MD5_CTX md5;
    MD5_Init(&md5);
    MD5_Update(&md5,word1,strlen(word1));
    MD5_Update(&md5,word2,strlen(word2));
    MD5_Final(output,&md5);
}

А если вам нужен пример использования:

char ret[100];
hashfunc(a, b, ret);
...