Проверка целостности файлов в больших пакетах файлов - PullRequest
0 голосов
/ 15 октября 2018

Каков наилучший рекомендуемый метод / подход для проверки «оригинальности файлов» большого количества файлов в каталоге?

Учитывая большое количество файлов, необходимых для передачи с одного сайта на другой, возможно,вероятность того, что файлы будут повреждены или внесено несанкционированное изменение во время процесса передачи.

В настоящее время я использую дату последнего изменения, чтобы проверить файл, чтобы убедиться, что файл все еще остается в «оригинальных» копиях.Я обнаружил, что с помощью контрольной суммы файла (MD5 / sha1), возможно, лучший подход по сравнению с проверкой даты последнего изменения файлов.

  1. Является ли использование файла MD5 лучшим подходом / методом для проверки / проверки файлов?Или есть лучший альтернативный метод / подход?
  2. Как насчет производительности?Процессор интенсивный?Генерирование MD5 / sha1 достаточно эффективно и быстро для обработки большого количества файлов?Будет ли размер файла влиять на время генерации MD5?

Ссылка: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/get-filehash?view=powershell-6

1 Ответ

0 голосов
/ 16 октября 2018

Дата последнего изменения может быть изменена по желанию, чтобы попытаться скрыть манипуляции с файлами.См. HeyScriptingGuy для примера .Вы можете хэшировать файлы с минимальной вычислительной мощностью.В качестве теста я запустил следующее:

Создать 100 файлов по 10 МБ каждый.

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 и 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 файлов размером 10 МБ

Algorithm    AverageTime
---------    -----------
MACTripleDES 42.44803523
MD5           3.50319849
RIPEMD160     9.58865946
SHA1          3.94368417
SHA256        7.72123966
SHA384        5.61478894
SHA512        5.62492335

Результаты для 10 файлов размером 100 МБ

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, которые больше не считаются безопасными, должны использоваться только для простой проверки изменений и не должны использоваться для генерации хеш-значений для файлов, которые требуют защиты от атак или взлома».

...