[英]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.