【问题标题】:is there a flaw in this md5 implementation?这个 md5 实现有缺陷吗?
【发布时间】:2021-10-13 20:36:10
【问题描述】:

我一直在研究需要 md5 计算的 bacula 云支持问题 并且一直在尝试使用https://github.com/firebladed/bacula/blob/Branch-11.0/bacula/src/lib/md5.c,并且从 amazon s3 得到了严重的 md5 错误

所以我尝试将代码直接编译成 md5sum 可执行文件,请参阅 (Makefile)

我得到的 md5 与 ubuntu md5sum 不同

md5sum (GNU coreutils) 8.28
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Ulrich Drepper, Scott Miller and David Madore.

Example File that gets wrong md5

2521308b3fe3836623f78708a5c988d6 - ubuntu md5sum

e972192662d26a25af5fb895cf79b175 - 编译的 md5sum

正在使用简单的命令行进行测试

./md5sum <file>

用于编译的 md5sum

md5sum <file>

用于系统 md5sum

使用链接示例

理想情况下,如果它的一些简单的 id 喜欢修复它

【问题讨论】:

  • 肯定是这样。向作者提出您的疑虑。
  • 你是如何测试它的?可能是你给它提供了不同的数据(比如一个有换行符,一个没有换行符或类似的东西)。
  • 通过文件作为参数进行测试,为问题添加了细节
  • md5.c 一次处理 4 个字节。你怎么告诉它字节顺序?
  • @stark 对于诸如文件之类的字节流应该没关系... FWIW,我的工具正在生成与 ubuntu 相同的哈希(嗯,不足为奇)

标签: c md5 md5sum bacula


【解决方案1】:

您的输入文件包含0x00 字节,而程序使用while(fgets(buf, ...)) } { MD5Update(..., strlen(buf)) }strlen 报告的大小小于“行”长度(您的输入文件似乎是二进制文件),因此生成的 md5sum 是一组不同的字节。

将您的输入数据转换为文本 (cat -v part.1),然后传递给两个程序,或者使用 for (int c; (c = fgetc(file)) != EOF; ) MD5Update(&amp;ctx. &amp;c, 1) 中的某些内容修复程序。

【讨论】:

  • thx,因为我需要处理二进制文件,所以请尝试 fgetc 方法,看看我在哪里
  • 以稍微不同的方式修复,使用 fread do while 循环,但 0x00 显然是问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-21
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 1970-01-01
相关资源
最近更新 更多