LINUX.ORG.RU

Проверка целостности по размеру

 


0

1

Вот есть директория на удалённом сервере. Из ней там проделываю:

find . -type f -exec sha256sum {} + > ../SHA256SUMS 2>/dev/null

Потом качаю директорию с сервера по медленному шифрованному каналу и провожу проверку на стороне клиента sha256sum -c SHA256SUMS.

Каким может быть чекер если вместо sha256sum использовать du -b?

★★★★★

crc32 (очень быстро), md5 (быстрее sha*), rsync --checksum, ... ?

anonymous
()

Зависит от того, насколько не нужны коллизии. crc32 и md5 можно файл подменить, хотя это и очень непросто. С sha256sum всё несколько труднее.

peregrine ★★★★★
()

Если удаленный сервер скомпрометирован, то доверять даже sha512sum нельзя.

anonymous
()

Я бы перенес все сервисы в виртуалку и делал сравнение хешей из хостовой оси.

anonymous
()

Я тогда забавную байку расскажу: в DOS был такой тип исполняемых файлов *.com. У него было ограничение на размер: всё должно помещаться в один сегмент (64КиБ). И вот какой-то вирус (а в те времена на любой машине их было больше, чем прыщей на моей подростковой роже) без каких-либо проверок и т.п. тупо цепляется к *.com'у увеличивая его размер сверх сегмента и, соответственно, нихрена не работает. Так вирус и спалился.

MimisGotAPlan
()

Решил проблему

#!/usr/bin/env python3

# check for sizes files list
# generated by: find . -type f -exec du -b {} + > ../SIZES.list 2>/dev/null

import sys, os

cant_read = 0
fails = 0

def check (path, size):
    global cant_read, fails

    if os.path.isfile(path) and os.access(path, os.R_OK):
        rsize = os.path.getsize(path)
        if size == rsize:
            return "OK"
        else:
            fails+=1
            return "FAILED"
    else:
        cant_read+=1
        return "FAILED open or read"


for line in sys.stdin:
    line = line.strip()
    ss, path = line.split(maxsplit=1)
    size = int(ss)

    sys.stdout.write("{}: {}\n".format(path, check(path, size)))

if cant_read !=0:
    if cant_read > 1:
        fw = "files"
    else:
        fw = "file"
    fmts = "check_sizes.py: WARNING: {} listed {} could not be read\n"
    sys.stderr.write(fmts.format(cant_read, fw))

if fails !=0:
    if fails > 1:
        fw = "checks have"
    else:
        fw = "check has"
    fmts = "check_sizes.py: WARNING: {} {} failed\n"
    sys.stderr.write(fmts.format(fails, fw))

Всем спасибо

ados ★★★★★
() автор топика
Ответ на: Решил проблему от ados

Странно, где-то ошибка:

Traceback (most recent call last):
  File "/home/redarch19/projects/4hards/check_sizes.py", line 26, in <module>
    for line in sys.stdin:
  File "/usr/lib/python3.5/codecs.py", line 321, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd8 in position 1585: invalid continuation byte
ados ★★★★★
() автор топика
Ответ на: комментарий от ados

md5sum и sha256sum с также созданными файлами прошли нормально - все проверки пройдены успешно. Вот как с python3 так сделать?

ados ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.