Я пытаюсь создать приложение, которое должно сравнивать хэш MD5 любого файла. Из-за определенных проблем перед загрузкой MD5 должен быть сгенерирован на стороне клиента, а после загрузки приложение должно проверить его на стороне сервера.
Мой первый подход заключался в использовании на стороне клиента JavaScript File API и функций FileReader.ReadAs
. Затем я использую алгоритм MD5, найденный здесь: http://pajhome.org.uk/crypt/md5/< /а>
На стороне сервера я бы использовал команду PHP fopen
и функцию md5
.
Этот подход отлично работает при использовании простых текстовых файлов. Но когда используется двоичный файл (например, jpg или pdf), MD5, сгенерированный на стороне клиента, отличается от сервера. Используя инструмент командной строки md5sum
, я понял, что сервер MD5 правильный, и проблема возникает на стороне клиента.
Я пробовал другие API MD5, которые я нашел, с теми же результатами. Подозреваю, что FileReader.ReadAs
функции загружают содержимое файла немного по-разному (перепробовал все варианты ReadAs
функций: текстовые, бинарные и т.д.), но не могу понять, в чем разница.
Я что-то упускаю, но не знаю что, может быть, мне нужно как-то декодировать контент перед созданием MD5.
Какие-нибудь советы?
Редактировать 1:
Я следовал идее, данной optima1. Взял каждый символ и напечатал номер юникода как на javascript, так и на PHP. Я мог видеть только одно отличие в конце всех случаев (использовал vimdiff).
PHP: 54 51 10 37 37 69 79 70 0
Javascript: 54 51 10 37 37 69 79 70
Может быть, этот лишний ноль в PHP — это какой-то «конец строки». В обоих случаях двоичные строки имеют одинаковую длину. Добавление String.fromCharCode(0) в конец содержимого JS не решает проблему. Я продолжу расследование.
Если я не могу найти решение, я попытаюсь построить гигантскую строку, объединив эти коды символов и используя ее для создания MD5. Это дерьмовое решение, но пока оно будет служить, и мне просто нужно будет добавить ноль в конец строки JS...
Редактировать 2:
Слава Богу! Эта реализация работает как шарм: http://www.myersdaily.org/joseph/javascript/md5.js
Если вам нужно сгенерировать хэш MD5 из двоичных файлов, сделайте это.
Заранее спасибо!