首页 文章

使用SHA1 MD5的组合

提问于
浏览
4

我正在尝试使用安全的方法为文件创建校验和(大于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);
        }
    }

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

Update 2 :

正如@ zaph提到的那样,我根据我读到的here再次实现了我的代码(C#MONO),但它并没有使用SHA256 .

2 回答

  • 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 .

  • 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?

相关问题