Как проверить целостность кучи файлов?

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

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

$accnum = 1;
$modulo = PHP_INT_MAX >> 5;
foreach ($files as $file) {
  $crc32 = crc32(md5_file($file));
  $accnum = ($accnum % $modulo) * 31 + $crc32;
}
$hash = md5($accnum);

Затем я записываю хеш туда, куда злоумышленник не может добраться.

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

Вопросы:
- Это разумный способ сделать это?
- Если нет, то как я могу контролировать целостность большого количества файлов?


person Free Radical    schedule 12.06.2015    source источник
comment
Чтобы ускорить процесс, вы также можете сохранить дату последнего изменения файла и сравнивать хэш, только если дата изменилась. Это должно ускорить работу приложения, поскольку проверка даты должна занимать меньше времени, чем проверка хэша. Я не знаю, является ли это лучшим решением для вашего случая, но об этом стоит подумать.   -  person Adon    schedule 12.06.2015
comment
другая возможность - «смотреть» каталог на предмет событий «файловой системы». Что-то вроде inotify-tools может оказаться полезным?   -  person Ryan Vincent    schedule 12.06.2015
comment
Ваш метод «хеш» будет работать нормально. Также сохраняйте «автономные резервные копии» вашего собственного веб-сайта, а также «резервные копии», предоставленные «хостинг-провайдером».   -  person Ryan Vincent    schedule 12.06.2015


Ответы (1)


Почему бы вам не использовать для этого Git? Держите удаленный репозиторий, куда ваш «злоумышленник» не сможет добраться, и следите за локальными изменениями или сравнивайте свой код с удаленным репо.

person Panayotis    schedule 12.06.2015
comment
Я использую Git для мониторинга локальных изменений для этого в некоторых других контекстах. В этом случае я хочу отслеживать только подмножество файлов, и поддержка .gitignore будет кошмаром. (Я не минусующий, хотя.) - person Free Radical; 12.06.2015
comment
Без проблем. Я считаю, что git — отличный способ отслеживать изменения и в то же время проверять целостность, потому что все в git суммируется с использованием хэша SHA-1, и реализация выполняется очень быстро. Вы также можете добавить файлы в белый список в .gitignore. - person Panayotis; 12.06.2015