【问题标题】:File Integrity check on large File Batches大型文件批次的文件完整性检查
【发布时间】:2018-10-15 06:17:45
【问题描述】:

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

考虑到需要从一个站点传输到另一个站点的大量文件,在传输过程中文件可能已损坏或未经授权的修改。

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

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

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

【问题讨论】:

  • 你有点回答了你自己的问题:是的,散列需要 CPU 时间,这与文件长度成正比。如果只有你能回答这个问题是可以接受的,请在你的硬件上运行一个有代表性的测试。
  • “1.性能方面怎么样?2.Cpu密集?”,1取决于文件大小和Cpu。 2. 是 CPU 密集型还是什么?如果您有大量用于并行化的小文件,也许是 GPU .. 或者您有一些 Hashing Asic?

标签: c# powershell md5 checksum


【解决方案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 和 RipeMD160

$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 应仅用于简单的更改验证,不应用于为需要保护免受攻击或篡改的文件生成哈希值。”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多