使用SHA1 + MD5的组合

时间:2016-07-19 13:02:41

标签: md5 sha1 checksum

我正在尝试使用安全的方式为文件创建校验和(大于10GB!)。

SHA256对我来说足够安全,但是这种算法过程昂贵而且不适合。 我知道SHA1和MD5校验和在碰撞中都是不安全的。

所以我认为最快和最安全的方法是将MD5与SHA1结合起来,例如:SHA1 + MD5,我认为没有办法同时使用相同的MD5和SHA1获取文件(Collision)。

那么将SHA1 + MD5安全组合到足以用于文件校验和吗?还是有任何类似碰撞的攻击?

我以两种方式使用c#mono(Bufferstream且没有Bufferedstream)

    public static string GetChecksum(string file)
    {
        using (FileStream stream = File.OpenRead(file))
        {
            var sha = new SHA256Managed();
            byte[] checksum = sha.ComputeHash(stream);
            return BitConverter.ToString(checksum).Replace("-", String.Empty);
        }
    }

    public static string GetChecksumBuffered(Stream stream)
    {
        using (var bufferedStream = new BufferedStream(stream, 1024 * 32))
        {
            var sha = new SHA256Managed();
            byte[] checksum = sha.ComputeHash(bufferedStream);
            return BitConverter.ToString(checksum).Replace("-", String.Empty);
        }
    }

更新1:  我的意思是SHA1哈希+ MD5哈希。首先计算文件的SHA1然后计算文件的MD5然后将这两个加在一起。

更新2:

正如@ zaph所提到的,我根据我所读的here再次实现了我的代码(C#MONO),但它并没有像我说的那样快速地实现我的代码!它使我的4.6 GB文件的速度从(大约)12分钟到大约8分钟但是sha1 + md5使我的文件不到100秒。所以我仍然认为使用SHA256是不对的。

2 个答案:

答案 0 :(得分:1)

如果通过SHA1 + MD5你的意思是首先使用SHA-1进行散列,然后在输入到MD5时使用该摘要,那么你不会完全消除冲突,只是潜在地减少了一次发生的可能性。

SHA-1和MD5都是固定长度的加密散列函数,如果消息长度大于摘要大小,则必然会发生Pigeonhole Principle冲突。在您的用例中有两个这样的实例:

  • 使用SHA-1
  • 散列任意长度的消息时
  • 当160位SHA-1摘要用作MD5的输入时

我的观点是碰撞总会存在。但是,找到一个的可能性非常小。如果唯一的目的是保证文件的完整性,那么SHA-1可以自己完成这项工作。

相关:

What checksum algorithm should I use?

Is MD5 still good enough to uniquely identify files?

答案 1 :(得分:1)

SHA-256与MD5 + SHA1的组合之间应该只有很小的差异。

了解基准的唯一方法是:

在我的桌面上:
SHA-256: 200 MB/s
MD5: 470 MB/s
SHA1: 500 MB/s (updated, previously incorrect)
MD5+SHA1 240 MB/s

这些时间仅用于散列,不包括磁盘读取时间。测试用1MB缓冲液完成,平均超过10次。语言是" C"使用的库是Apple的Common Crypto。 cpu是2.8 GHz四核Intel Xeon(2010 MacPro,我的笔记本电脑更快)。

最后使用组合MD5 + SHA1的速度提高了23%。

注意:大多数英特尔处理器都有可用于加快加密操作的指令。并非所有实现都使用这些说明。

YOumight尝试使用sha256sum等本机实现。