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

时间:2019-07-07 14:41:44

标签: c++ md5

我使用以下命令使用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

2 个答案:

答案 0 :(得分:3)

(unsigned char*)&string

您要对指针本身(及其后的未指定数据)进行哈希处理,而不是对其指向的字符串进行哈希处理。

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

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

答案 1 :(得分:2)

设为MD5((unsigned char*)string, ...);放下“&”号。您没有将字符数据传递给MD5-您正在传递string指针本身的值(即,密码的第一个字符的地址),以及传递给代码的任何垃圾。叠起来。