大型文件批处理的文件完整性检查

时间:2018-10-15 06:17:46

标签: c# powershell md5 checksum

检查目录中大量文件的“文件独创性”的最佳推荐方法/方法是什么?

考虑到从一个站点转移到另一站点所需的大量文件,在传输过程中可能会损坏文件或对文件进行未经授权的修改。

当前,我正在使用“上次修改日期”来检查文件,以验证文件是否仍为“原始”副本。 我发现通过文件校验和(MD5 / sha1)可能比检查文件的上次修改日期更好。

  
      
  1. 使用文件MD5是否是检查/验证文件的最佳方法/方法?还是有更好的替代方法/方法?
  2.   
  3. 性能方面如何? CPU密集?通过生成MD5 / sha1是否足够高效,快速地处理大量文件?档案大小   影响生成MD5的时间?
  4.   

参考:https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/get-filehash?view=powershell-6

1 个答案:

答案 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.1v6已删除的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只能用于简单的更改验证,而不能用于为需要保护免受攻击或篡改的文件生成哈希值。”