Как узнать, был ли загруженный файл изменен? - PullRequest
3 голосов
/ 27 ноября 2011

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

У меня естьтаблица журнала с User_id и FileName (User_id уникальна).Я удаляю файл после прочтения содержимого.

Ответы [ 2 ]

7 голосов
/ 27 ноября 2011

Вы можете сохранить хэш файла перед его удалением. Чтобы увидеть, загружается ли тот же файл, сравните хеш с предыдущим хешем. Вы можете сделать это с помощью одного из классов HashAlgorithm в System.Cryptography, например SHA1 .

"Криптографическая хеш-функция - это детерминированная процедура, которая требует произвольный блок данных и возвращает битовую строку фиксированного размера, (криптографическое) хеш-значение, так что случайное или преднамеренное изменение данных изменит значение хеша "

Вот пример кода, с которого можно начать, предполагая, что переменная stream - это поток данных вашего файла (вы можете использовать FileStream, чтобы открыть его):

var sha = new System.Security.Cryptography.SHA1Managed();
byte [] hash = sha.ComputeHash(stream);

Теперь переменная hash будет содержать хэш, отпечаток содержимого файла. Даже небольшое изменение (например, одного бита) приведет к другому значению хеша, но взятие хеша для одного и того же файла всегда будет возвращать один и тот же хеш.

3 голосов
/ 27 ноября 2011

Хэш - это общий вид функции. Обычно для обнаружения изменений в больших порциях данных, таких как файлы, используется некоторая crc

Под linux есть стандартная утилита cksum

Вы можете создать cksum filename и получить вывод. Сохраните его, например, в своей базе данных и проверьте входящий новый файл.

...