【问题标题】:C getting equal hash values for different strings opensslC为不同的字符串获取相等的哈希值openssl
【发布时间】:2012-10-17 10:23:44
【问题描述】:

我对 c 很陌生。我正在尝试将两个文件与 md5 进行比较。 我写了一个应该返回哈希值的函数。但是当比较不同文件或缓冲区的值时,它说它们具有相同的哈希值。

unsigned char* getMD5(void *buffer, size_t bsize) {
    EVP_MD_CTX *mdctx;
    const EVP_MD *md;
    unsigned char hashwert[EVP_MAX_MD_SIZE];
    int hashwert_laenge;
    OpenSSL_add_all_digests();
    md = EVP_get_digestbyname("MD5");
    mdctx = EVP_MD_CTX_create();
    EVP_DigestInit_ex(mdctx, md, NULL);
    EVP_DigestUpdate(mdctx, buffer, bsize);
    EVP_DigestFinal_ex(mdctx, hashwert, &hashwert_laenge);
    EVP_MD_CTX_destroy(mdctx);
    return hashwert;
}

//in main...
char mess[] = "abc";
cahr mess2[] = "bcd";
if(strcmp(getMD5(mess, strlen(mess)),getMD5(mess2, strlen(mess2))==0) {
   printf("euqal\n");
}else {
   printf("not equal \n"); 
}

我总是知道缓冲区是相等的,即使它们不是。 问候

【问题讨论】:

    标签: c openssl md5


    【解决方案1】:

    您应该在启用所有警告和调试信息的情况下进行编译,例如在 Linux 上使用 gcc -Wall -g

    它会警告你:函数返回局部变量的地址

    新手和专家 C 程序员通常应该改进他们的代码,直到没有给出警告。如果您的代码触发了您确实无法避免的警告,您至少应该非常仔细地注释原因。

    你不能有意义地返回某个本地数组的地址。

    您可以return strdup(hashwert); 并约定调用函数(调用者)应该free 结果。

    或者您可以使用不同的 API,例如将 hashwert 作为函数的参数。

    【讨论】:

    • 是的,有一个警告,我使用额外的缓冲区作为参数来修复它,而不是返回。谢谢!
    猜你喜欢
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 2021-05-09
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多