检查目录中大量文件的“文件独创性”的最佳推荐方法/方法是什么?
考虑到从一个站点转移到另一站点所需的大量文件,在传输过程中可能会损坏文件或对文件进行未经授权的修改。
当前,我正在使用“上次修改日期”来检查文件,以验证文件是否仍为“原始”副本。 我发现通过文件校验和(MD5 / sha1)可能比检查文件的上次修改日期更好。
- 使用文件MD5是否是检查/验证文件的最佳方法/方法?还是有更好的替代方法/方法?
- 性能方面如何? CPU密集?通过生成MD5 / sha1是否足够高效,快速地处理大量文件?档案大小 影响生成MD5的时间?
答案 0 :(得分:1)
最后修改日期可以随意更改以尝试屏蔽文件操作。请参见HeyScriptingGuy for an example。您可以用相当小的计算能力来散列文件。作为测试,我运行了以下程序:
分别生成100个10Mb的文件。
Add-Type -AssemblyName System.Web
1..100 | %{
#get a random filename in the present working directory
$fn = [System.IO.Path]::Combine($pwd, [GUID]::NewGuid().ToString("N") + '.txt')
#set number of iterations
$count = 10mb/128
#create a filestream
$fs = New-Object System.IO.FileStream($fn,[System.IO.FileMode]::CreateNew)
#create a streamwriter
$sw = New-Object System.IO.StreamWriter($fs,[System.Text.Encoding]::ASCII,128)
do{
#Write the chars plus eol
$sw.WriteLine([System.Web.Security.Membership]::GeneratePassword(126,0))
#decrement the counter
$count--
}while($count -gt 0)
#close the streamwriter
$sw.Close()
#close the filestream
$fs.Close()
}
创建一系列支持的算法。这是针对PSv4, v5, v5.1,v6已删除的MACTripleDES和RawMD160
$algorithms = @('MACTripleDES','MD5','RIPEMD160','SHA1','SHA256','SHA384','SHA512')
每种算法将所有文件哈希10次,然后取平均值。
foreach($algorithm in $algorithms) {
$totalTime = 0
1..10 | ForEach-Object {
$totalTime += measure-command {dir | Get-FileHash -Algorithm $algorithm} | Select-Object -ExpandProperty TotalSeconds
}
[PSCustomObject]@{
Algorithm = $algorithm
AverageTime = $totaltime/10
}
}
100个10Mb文件的结果
Algorithm AverageTime
--------- -----------
MACTripleDES 42.44803523
MD5 3.50319849
RIPEMD160 9.58865946
SHA1 3.94368417
SHA256 7.72123966
SHA384 5.61478894
SHA512 5.62492335
10个100Mb文件的结果
Algorithm AverageTime
--------- -----------
MACTripleDES 43.82652673
MD5 3.40958188
RIPEMD160 9.25260835
SHA1 3.74736209
SHA256 7.19778535
SHA384 5.17364897
SHA512 5.17803741
我建议在您的系统上运行类似的基准测试,以查看其影响。同样来自文档:“出于安全原因,不再被认为是安全的MD5和SHA1只能用于简单的更改验证,而不能用于为需要保护免受攻击或篡改的文件生成哈希值。”