MD5 仍然是验证文件完整性的可行解决方案吗?

MD5 仍然是验证文件完整性的可行解决方案吗?

我读到有关 MD5 冲突的信息,并且 MD5 不再可靠,但是,我很好奇当我们检查文件的完整性时这是否适用。我注意到 FLAC/metaflac(免费无损音频编解码器)等工具仍然依赖 MD5 来检查音乐文件的数据完整性。

答案1

是的,即使 CRC32 也是可行的,因为当您听说 MD5/SHA1 的冲突时,它是关于使用疯狂的计算能力来专门制作数据来创建具有冲突的文件。

这不适用于您的存储/RAM/IO 可能发生的单位错误。

但需要注意一件事:对于较新的 CPU,SHA1/SHA256 可以是快得多与 MD5 相比,因为前者是硬件加速的,而 MD5 是计算的。

只需运行time sha256sum/md5sum large_enough_file即可查看。

对于此处的缓存 4.5GB 文件:

$ time md5sum *iso
b5a7be560dbd73619945129e52be1b5f  win10.iso

real    0m5.037s
user    0m4.805s
sys 0m0.229s

$ time sha256sum *iso
c90a6df8997bf49e56b9673982f3e80745058723a707aef8f22998ae6479597d  win10.iso

real    0m2.283s
user    0m2.031s
sys 0m0.250s

这是我很久以前编写的一个很好的脚本,用于创建一个包含所有音频文件哈希和的文件。

#! /bin/bash

cd /audio || exit 1

echo -n "Running ... "
find . \(   -iname "*.mp3" -o \
        -iname "*.m4a" -o \
        -iname "*.ogg" -o \
        -iname "*.flac" \
    \) -print0 | sed 's/\.\///' | sed 's/\x0\.\//\x0/g' | sort -z | xargs -0 -n1 ionice -c 3 md5sum | tee /tmp/ALL-`date +%F`.md5 | \
        awk '
            BEGIN{ORS=""}
            {
                out=substr($0, 35);
                print out;
                fflush();
                for (i=0;i<length(out);i++) print "\b \b";
            }
            END{print FNR" all done\n";}
        '
echo " finished"

对于/audio目录,它计算所有指定文件类型的 md5 哈希值并生成一个/tmp.

相关内容