c++ - Openssh 程序化 MD5 哈希摘要与 shell 命令输出不匹配

标签 c++ openssl md5

我正在使用 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/

相关文章:

c++ - C++ 代码块中的 "this"关键字指的是什么?

C++:当在参数中构造的对象被破坏时?

encryption - 如何手动计算和验证证书签名请求的签名

c# - AzCopy 忽略或重新创建校验和

c++ - 了解 CRTP 示例中的复制构造函数

c++ - 如何遍历通过引用传递的多个对象?

Python 引用旧的 SSL 版本

c# - 使用C#使用open ssl加密/解密

javascript - 比 MD5 更好的方法吗?

php - MD5、密码散列和盐位