我正在使用 openssl 库试验 MD5 哈希。当我运行下面的代码时:
std::string test("123"); // salt
test.append("TestPhrase"); // password
unsigned char buffer[test.size()];
strcpy((char *)buffer, test.c_str());
unsigned char digest[MD5_DIGEST_LENGTH];
MD5_CTX(ctx);
MD5_Init(&ctx);
MD5_Update(&ctx, buffer, test.size());
for(int i = 0; i < MD5_DIGEST_LENGTH; ++i)
{
printf("%02x", digest[i]);
}
putchar('\n');
我一直得到的哈希值为:
ad9c231a6c45cccecc3b558545e7fd75
我使用 Openssl 文档作为引用,并环顾四周看看其他人是如何做的。它当然不是最干净的代码,但我不认为这是不正确的。但是,当我尝试运行 openssl 命令时,它使用相同的库并且我认为是相同的哈希函数,但我得到了一个完全不同的值:
openssl passwd -quiet -salt "123" -1 "TestPhrase"
$1$123$PWLKL9JcywaTF.UrzC7ov/
我还尝试了 Apache 变体算法 -apr1,它也会生成一个不匹配的散列。我假设这一定是我在屏幕上显示位的方式,但这似乎是我发现的每篇文章的方式。我错过了什么?
最佳答案
openssl passwd
的文档针对 -1
选项说:使用基于 MD5 的 BSD 密码算法 1。这与您正在做的使用 MD5 不同。只需采用 md5 即可生成相当容易破解的密码。
你可以浏览一下md5crypt function在 openssl passwd 工具中执行以查看实际过程涉及的更多。例如它包括 a loop重复 (1000x) 调用 EVP_DigestUpdate()
很难找到基于 MD5 的 BSD 密码算法 1 的正确描述,但这篇博文做得很好:Password hashing with MD5-crypt in relation to MD5
如果您确实想使用 OpenSSL 工具重现当前结果,您可以像这样使用 dgst
:
$ printf 123TestPhrase | openssl dgst -md5
ad9c231a6c45cccecc3b558545e7fd75
关于c++ - Openssh 程序化 MD5 哈希摘要与 shell 命令输出不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66681465/