繁体   English   中英

C语言中字符串中的MD5哈希

[英]MD5 hashing in a string in C

我目前正在尝试使用以下MD5库将C中的两个字符串哈希在一起: 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);
}

提前致谢。

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM