C中字符串的MD5哈希
MD5 hashing in a string in C
我目前正在尝试使用以下 MD5 库在 C 中将两个字符串散列在一起:
https://openwall.info/wiki/people/solar/software/public-domain-source-code/md5
但是,当我 运行 我的代码(编译时没有警告)时,出现内存错误(段错误或类似错误)。
哪里出错了?谁能指出我正确的方向?
代码:
#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);
}
更改为:
- 使用临时工作缓冲区将单词连接在一起进行哈希处理。
- 不是 return 一个值,而是选择让用户传入一个缓冲区来处理 return 值。
第二个变化的好处是消费者可以使用堆栈上的内存,而不是总是被迫处理函数内部的内存分配。 (另一种方法是 malloc 内存和 return that,速度较慢,必须手动释放)。
此外,我不太确定您使用的 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);
我目前正在尝试使用以下 MD5 库在 C 中将两个字符串散列在一起: https://openwall.info/wiki/people/solar/software/public-domain-source-code/md5
但是,当我 运行 我的代码(编译时没有警告)时,出现内存错误(段错误或类似错误)。
哪里出错了?谁能指出我正确的方向?
代码:
#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);
}
更改为:
- 使用临时工作缓冲区将单词连接在一起进行哈希处理。
- 不是 return 一个值,而是选择让用户传入一个缓冲区来处理 return 值。
第二个变化的好处是消费者可以使用堆栈上的内存,而不是总是被迫处理函数内部的内存分配。 (另一种方法是 malloc 内存和 return that,速度较慢,必须手动释放)。
此外,我不太确定您使用的 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);