使用 SHA1+MD5 的组合
Use a combination of SHA1+MD5
我正在尝试使用一种安全的方式为文件(大于 10GB!)创建校验和。
SHA256 对我来说足够安全,但这种算法的处理成本很高,不适合。
好吧,我知道 SHA1 和 MD5 校验和通过冲突都是不安全的。
所以我认为最快和最安全的方法是将 MD5 与 SHA1 结合起来,例如:SHA1+MD5,我认为没有办法同时获取具有相同 MD5 和 SHA1 的文件(冲突)时间.
那么组合 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:
As @zaph mentioned I implement my code(C# MONO) again according what I read here 但它并没有让我的代码像他说的那么快!它使我处理一个 4.6 GB 文件的速度从(大约)12 分钟到大约 8.~ 分钟,但是 sha1+md5 花费我不到 100 秒的时间来处理这个文件。所以我还是觉得用SHA256代替是不对的。
如果您所说的 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?
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%。
注意:大多数英特尔处理器都有可用于加快加密操作速度的指令。并非所有实现都使用这些指令。
您可以尝试原生实现,例如 sha256sum
。
我正在尝试使用一种安全的方式为文件(大于 10GB!)创建校验和。
SHA256 对我来说足够安全,但这种算法的处理成本很高,不适合。 好吧,我知道 SHA1 和 MD5 校验和通过冲突都是不安全的。
所以我认为最快和最安全的方法是将 MD5 与 SHA1 结合起来,例如:SHA1+MD5,我认为没有办法同时获取具有相同 MD5 和 SHA1 的文件(冲突)时间.
那么组合 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:
As @zaph mentioned I implement my code(C# MONO) again according what I read here 但它并没有让我的代码像他说的那么快!它使我处理一个 4.6 GB 文件的速度从(大约)12 分钟到大约 8.~ 分钟,但是 sha1+md5 花费我不到 100 秒的时间来处理这个文件。所以我还是觉得用SHA256代替是不对的。
如果您所说的 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?
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%。
注意:大多数英特尔处理器都有可用于加快加密操作速度的指令。并非所有实现都使用这些指令。
您可以尝试原生实现,例如 sha256sum
。