我正在尝试使用安全的方式为文件创建校验和(大于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是不对的。
答案 0 :(得分:1)
如果通过SHA1 + MD5你的意思是首先使用SHA-1进行散列,然后在输入到MD5时使用该摘要,那么你不会完全消除冲突,只是潜在地减少了一次发生的可能性。
SHA-1和MD5都是固定长度的加密散列函数,如果消息长度大于摘要大小,则必然会发生Pigeonhole Principle冲突。在您的用例中有两个这样的实例:
我的观点是碰撞总会存在。但是,找到一个的可能性非常小。如果唯一的目的是保证文件的完整性,那么SHA-1可以自己完成这项工作。
相关:
答案 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
等本机实现。