【问题标题】:Confusing output when calcualting md5 hash (newbie)计算 md5 哈希时输出混乱(新手)
【发布时间】:2020-10-13 21:08:05
【问题描述】:

在我的 linux 机器上,为了在套接字上进行身份验证,我必须计算一个 md5 哈希码。 (我知道 md5 已经过时了)。安装 Openssl 后,我可以在 Eclipse 中编译这段代码:

unsigned char *MD5(const unsigned char *d, unsigned long n,
             unsigned char *md);

string codewd = "admin:BaseX:admin";
unsigned char result[MD5_DIGEST_LENGTH];
unsigned char md5_pwd[MD5_DIGEST_LENGTH];

// Test 1
const unsigned char* str;
str = (unsigned char*)"Hallooo";
unsigned int long_size = 100;
for (long unsigned int i = 0; i < sizeof(result); i++) result[i] = '\0';
MD5(str, long_size, result);
cout << "Result : " << result << endl;

// Test 2
string nonce = "25009293498380";
const unsigned char * code = (const unsigned char *)codewd.c_str();
for (long unsigned int i = 0; i < sizeof(md5_pwd); i++) md5_pwd[i] = '\0';
MD5((const unsigned char *) code, long_size, md5_pwd);
cout << "md5_pwd : " << md5_pwd << endl;

这段代码给出了这个输出:

Result : Y����P2KT�L����
md5_pwd : �?�a'=����Y��aOY����P2KT�L����

不知道是否需要初始化'result'和'md5_pwd'。 'nonce' 将在稍后使用。

我有两个问题:

  1. 每次运行此代码都会给出不同的输出。我希望计算 md5 哈希每次都会得到相同的结果。
  2. 为什么第一个哈希(为“结果”计算)附加到第二个哈希?

【问题讨论】:

  • MD5 不输出一串可打印字符,它输出一个 128 位的哈希值。如果要将其输出到屏幕,则需要将二进制转换为可打印的表示。我理解这可能会造成混淆,因为纯二进制数据与许多字符串类型是相同的数据类型 (unsigned char*)
  • 我对这样的输出不感兴趣,输出只是为了测试而创建的。并且测试表明,每次运行都会给出不同的结果,并且第一个结果会附加到第二个结果。这就是问题

标签: c++ md5


【解决方案1】:

此代码的每次运行都会给出不同的输出。

你将long_size传递给MD5函数,但输入字符串的长度不是long_size,所以算法读取了一堆垃圾。

试试这个:

MD5(str, strlen(str), result);

为什么第一个散列(为“结果”计算)附加到第二个散列?

md5_pwd 不包含终止空值,因此会打印分配数组之后的内存内容。打印:

cout.write(md5_pwd, MD5_DIGEST_LENGTH);

【讨论】:

  • 根据MD5的签名,第一个参数应该是const unsigned char *d。编译 strlen(str) 得到invalid conversion from ‘const unsigned char*’ to ‘const char*’
  • 这是因为strlen 需要const char*。我会将"Hallooo" 保留为const char*const char[],并且仅在传递给MD5 时才进行转换。
  • 转换后我的代码编译,但我仍然得到这个输出,其中第一个 MD5() 的结果附加到第二个 MD5()。结果:(�Ј�Ooy�k&lt;bΰ� md5_pwd : 0K±8�Ooy�k<bΰ�
  • 添加演员表后“cout.write((const char *)md5_pwd, MD5_DIGEST_LENGTH);”一切正常。感谢您的解释
猜你喜欢
  • 2012-04-14
  • 1970-01-01
  • 2011-12-08
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
  • 2011-08-27
  • 2012-07-12
  • 2015-12-18
相关资源
最近更新 更多