我正在尝试使用安全的方法为文件创建校验和(大于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 :
2 回答
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 .
如果通过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?