我必须在一些机器上同步大文件.这些文件最大可达6GB.同步将每隔几周手动完成.我不能考虑文件名,因为它们可以随时更改.
我的计划是在目标PC和源PC上创建校验和,然后将所有尚未在目标中的校验和文件复制到目标.我的第一次尝试是这样的:
using System.IO;
using System.Security.Cryptography;
private static string GetChecksum(string file)
{
using (FileStream stream = File.OpenRead(file))
{
SHA256Managed sha = new SHA256Managed();
byte[] checksum = sha.ComputeHash(stream);
return BitConverter.ToString(checksum).Replace("-", String.Empty);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是运行时:
- 使用带有1,6 GB文件的SHA256 - > 20分钟
- 使用带有1.6 GB文件的MD5 - > 6.15分钟
是否有更好 - 更快 - 获得校验和的方法(可能具有更好的散列函数)?
我的理解是哈希码和校验和是类似的东西 - 为数据块计算的数值,它是相对独特的.
即,产生相同数字散列/校验和值的两个数据块的概率足够低,以至于出于应用目的可以忽略它.
那么我们是否有两个单词用于相同的事情,或者哈希码和校验和之间是否存在重要差异?
我正在尝试使用一种安全的方式为文件创建校验和(大于 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); …Run Code Online (Sandbox Code Playgroud) 问题:
我正在尝试创建一个函数来创建我的 asp.net Web 应用程序后端源代码的哈希码。
只要没有任何改变,这个哈希码就必须是相同的。即使我重建我的项目。
有人知道,我该怎么做?
我尝试过的:
我发现的唯一可行的解决方案是将所有重要文件连接到一个大字符串并从中创建一个哈希码。
这个解决方案的问题是,我必须将所有源文件添加到输出目录中,出于安全原因不应该这样做。
希望有人有个好主意=)
提前致谢!
更新:
我可以按照 Renat 的建议通过启用确定性构建来解决我的问题。
刚刚将确定性标志添加到我的 .csproj 文件中,如下所示:
<Deterministic>True</Deterministic>
Run Code Online (Sandbox Code Playgroud)