我正在开发一个程序,搜索整个驱动器的给定文件.目前,我计算了已知文件的MD5哈希值,然后递归扫描所有文件,寻找匹配项.
唯一的问题是MD5在大文件上的速度非常慢.是否有更快的替代方案,我可以使用,同时保留一个非常小的误报可能性?
所有代码都在C#中.
谢谢.
更新
我已经读过,即使MD5也可以非常快,磁盘I/O应该是限制因素.这让我相信我的代码可能不是最佳的.这种方法有什么问题吗?
MD5 md5 = MD5.Create();
StringBuilder sb = new StringBuilder();
try
{
using (FileStream fs = File.Open(fileName, FileMode.Open, FileAccess.Read))
{
foreach (byte b in md5.ComputeHash(fs))
sb.Append(b.ToString("X2"));
}
return sb.ToString();
}
catch (Exception)
{
return "";
}
Run Code Online (Sandbox Code Playgroud) 我们有一个带注册扩展的.NET 3.5应用程序.我们如何保护它免受DLL劫持攻击?
由于传统和设计问题,强大的命名/签名现在不是一种选择
如果您不知道DLL劫持是什么,请提供额外信息:
以前我问了一个关于组合SHA1 + MD5 的问题,但之后我理解计算SHA1然后延迟文件的MD5并不比SHA256快.在我的情况下,4.6 GB文件大约需要10分钟,在Linux系统中使用默认实现SHA256和(C#MONO).
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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后我读了这个主题,并以某种方式根据他们所说的改变我的代码:
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)
但它没有这样的感情,需要大约9分钟.
然后我尝试通过sha256sumLinux中的命令测试我的文件中的相同文件,它需要大约28秒,上面的代码和Linux命令都给出相同的结果!
有人建议我阅读Hash Code和Checksum之间的区别,然后我会谈到这个解释差异的主题.
我的问题是:
是什么导致上述代码和Linux之间的这种不同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); …Run Code Online (Sandbox Code Playgroud) 大家早上好,
我正在使用C#中的MD5文件完整性检查工具.
为文件提供MD5校验和值需要多长时间?例如,如果我尝试获取2gb .mpg文件,则每次约需5分钟.这似乎过长了.
我只是不耐烦吗?
下面是我正在运行的代码
public string getHash(String @fileLocation)
{
FileStream fs = new FileStream(@fileLocation, FileMode.Open);
HashAlgorithm alg = new HMACMD5();
byte[] hashValue = alg.ComputeHash(fs);
string md5Result = "";
foreach (byte x in hashValue)
{
md5Result += x;
}
fs.Close();
return md5Result;
}
Run Code Online (Sandbox Code Playgroud)
任何建议将不胜感激.
问候