Вычисление MD5 сигнатур файлов
Зачем это понадобилось
Возникла задача определить "качество" хранения и копирования неких больших файлов. Создавались они само собой на жестком диске , потом могли быть скопированы по локальной сети, закачивались на FTP сервер, записывались на CDR(W). Тут и встала проблема обнаружения "битых" копий. Общий метод борьбы известен: считай контрольную сумму. Какой из алгоритмов выбрать? Остановились на MD5 по следующим причинам:
- это современный, стойкий, быстрый алгоритм
- существуют консольные утилиты для вычисления
- бесплатная реализация в виде динамической библиотеки
- нафига еще искать, если это прекрасно работает 😉
The MD5 Message-Digest Algorithm
Сначала заставим Google поискать "md5". В первых строках получаем ссылку на MD5 Homepage (unofficial) откуда узнаем, что
MD5 был разработан в 1992 году Профессором Ronald L. Rivest из Массачусетского технологического института (MIT), одним из основателей RSA Security. Подробное описание можно найти в RFC 1321, а если коротко, то
[MD5 алгоритм] получает на вход сообщение произвольной длины и на выходе выдает "подпись"(сигнатуру) длиной 128 битов. Предполагается, что не существует двух сообщений имеющих одинаковые сигнатуры, или, что невозможно создать сообщение с заранее заданной сигнатурой. MD5 алгоритм в основном используется в крипрографических приложениях типа RSA. По существу, MD5 - это способ проверки целостности данных, гораздо более надежный, чем контрольная сумма или другие методы.
Другой умный мужик Francisco Carlos Piragibe de Almeida написал нам на счастье a DLL with a BAS wrapper module
Кроме того находим парочку консольных утилит
Условия использования простые - не забывайте указать "RSA Data Security, Inc. MD5 Message-Digest Algorithm" в своих программах и других материалах. Что собственно и делем 😉
Начинаем реализовавать новые знания
Для начала бэйсиковскую программку переводим на лисиный язык, попутно исправляя ошибки (кому интересно может тоже поразвлекаться с Fault Error) и оформляя все в виде класса.
[code] *-------------------------------------------------- * Это будет метод Init *-------------------------------------------------- DECLARE INTEGER MDStringFix IN aamd532.dll STRING s, LONG l, STRING r DECLARE INTEGER MDFile IN aamd532.dll STRING f, STRING r *-------------------------------------------------- * Function MD5String -- оформим одноименным методом *-------------------------------------------------- PARAM s r = SPACE(32) l = LEN(s) = MDStringFix( s, l, @r) RETURN r *-------------------------------------------------- * Function MD5File -- оформим одноименным методом *-------------------------------------------------- PARAM fname r = SPACE(32) = MDFile( fname, @r) RETURN r [/code]
В Command окне протестируем оба метода. Для проверки первого в конце RFC 1321 приведены тестовые образцы. Для проверки сигнатуры файла возьмем образец из дистрибутива FreeBSD 4.1-RELEASE В каждой папке с файлами там имеется файл checksum.md5, который представляет собой список сигнатур файлов.
[code] set classlib to md5 o=createobject("md5") && ------ Правильные ответы ------- ? o.md5string("") && d41d8cd98f00b204e9800998ecf8427e ? o.md5string("a") && 0cc175b9c0f1b6a831c399e269772661 ? o.md5string("abc") && 900150983cd24fb0d6963f7d28e17f72 ? o.md5string("message digest") && f96b697d7cb7938d525a2f31aaf161d0 ? o.md5string(space(15000000)) && Сигнатура 15 миллионов пробелов 😉 ? o.md5file("bin.aa") && e16d5641bd71c1308b9a85d47b3e6309 ? o.md5file("blabla.bla") && FILE NOT FOUND [/code]
Собственно метод, используемый во FreeBSD, нас вполне устраивает. Перед тем как переместить данные будем создавать файл checksum.md5 Для этого служит метод нашего класса MD5MakeList, которому будем передавать путь к папке с данными, а он породит нам список и вернет число обработанных файлов или -1 при ошибке. Позднее в класс были добавлены простенький "прогрессбар" (чтобы пользователь не скучал ;), а также свойства:
BadFileCount -- после MD5MakeList содержит число необсчитанных файлов.
Download
Это архив с классом md5.vc*, библиотекой aamd532.dll и утилиткой md5.exe
aamd532.dll скопируйте в WindowsSystem или WINNTSystem32
PS. MD5 (md5vfp.zip) = dc8e6ec6d0e84fff9fb4c73289c09210 🙂
2001, Тепликов Илья, itp@karelia.ru