为啥当我在 MD5 哈希中转换相同的 C++ 字符串时,每次都会获得不同的输出?

Posted

技术标签:

【中文标题】为啥当我在 MD5 哈希中转换相同的 C++ 字符串时,每次都会获得不同的输出?【英文标题】:Why when I convert the same C++ string in MD5 hash I obtain every time a different output?为什么当我在 MD5 哈希中转换相同的 C++ 字符串时,每次都会获得不同的输出? 【发布时间】:2019-07-07 14:41:44 【问题描述】:

我使用 python 脚本使用以下命令将字符串转换为 MD5 哈希:

admininfo['password'] = hashlib.md5(admininfo['password'].encode("utf-8")).hexdigest()

这个值现在存储在一个在线数据库中。

现在我正在创建一个 C++ 脚本来登录这个数据库。在登录过程中,我要求输入密码,然后将其转换为 MD5 哈希值,以便与在线数据库中的值进行比较。

但是给出相同的字符串,我每次都会得到不同的 MD5 哈希值。

我该如何解决?

cin >> Admin_pwd;
cout << endl;

unsigned char digest[MD5_DIGEST_LENGTH];
const char* string = Admin_pwd.c_str();

MD5((unsigned char*)&string, strlen(string), (unsigned char*)&digest);    

char mdString[33];

for(int i = 0; i < 16; i++)
    sprintf(&mdString[i*2], "%02x", (unsigned int)digest[i]);

printf("md5 digest: %s\n", mdString);

第一次尝试:

md5 digest: dcbb3e6add7fb94b98c56d7f70b7c46e

第二次尝试:

md5 digest: 2870f4de491ad17d53d6d6e9dae19ca9

第三次尝试:

md5 digest: 84656428baf461093e9fca2c8b05a296

【问题讨论】:

请不要在 C++ 中使用 C 风格的强制转换。 【参考方案1】:
(unsigned char*)&string

您正在散列指针本身(以及它后面的未指定数据),而不是它指向的字符串。

而且每次执行都会改变(也许)。

你的意思只是(unsigned char*)string

【讨论】:

【参考方案2】:

设为MD5((unsigned char*)string, ...);放下与号。您没有将字符数据传递给MD5 - 您正在传递string 指针本身的值(即密码的第一个字符的地址),以及它后面的堆栈上发生的任何垃圾。

【讨论】:

以上是关于为啥当我在 MD5 哈希中转换相同的 C++ 字符串时,每次都会获得不同的输出?的主要内容,如果未能解决你的问题,请参考以下文章

C++:检查字符串是不是是有效的 MD5 十六进制哈希

Xcode C++ MD5 哈希

为啥 pip 因包的 md5 哈希错误而失败?

为啥 Ruby 象征着我的哈希键?

CTF之MD5相等值不相等

C++ 哈希表问题