Создайте тот же MD5, используя javascript и PHP

Я пытаюсь создать приложение, которое должно сравнивать хэш 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 из двоичных файлов, сделайте это.

Заранее спасибо!


person marcellorvalle    schedule 24.06.2013    source источник
comment
ты пробовал это? phpjs.org/functions/md5 phpjs.org/functions/md5_file   -  person bystwn22    schedule 25.06.2013
comment
Да, я тоже пробовал эту реализацию. Он генерирует те же хэши. Я думаю, что мне не хватает чего-то относительно содержимого файла.   -  person marcellorvalle    schedule 25.06.2013
comment
Просто чтобы проверить, вы не используете md5 для чего-либо, связанного с безопасностью, не так ли?   -  person Simba    schedule 24.02.2017
comment
Нет, я не. Не волнуйтесь. :)   -  person marcellorvalle    schedule 26.02.2017


Ответы (2)


http://membres-liglab.imag.fr/donsez/cours/exemplescourstechnoweb/js_securehash/

javascript md5 и php md5 одинаковы, но нам нужно использовать некоторые функции... эти функции мы можем получить из приведенного выше URL-адреса....

person Ramakanth Rapaka    schedule 09.12.2013
comment
Ответы только по ссылке не рекомендуются, отчасти потому, что ссылка может в конечном итоге стать неработающей, что сделает ответ бесполезным. Пожалуйста, предоставьте некоторый контекст из ссылки. - person Robert; 09.12.2013
comment
Я должен поставить +1, потому что связанная реализация javascript — единственная, которая дала мне те же результаты, что и PHP с двоичными данными (пробует PhpJ, CryptoJ и некоторые другие), спасибо, что спасли мой день. - person Romain; 27.09.2016
comment
То же самое здесь, выдает точно такой же вывод, спасибо Ramakanth! - person Leandro Gamarra; 23.04.2021

Я бы предложил выполнить быструю проверку работоспособности: пусть ваш клиентский код сообщает о первом и последнем байтах двоичных данных. Повторите в своем PHP-коде. Сравните первый и последний байты обоих методов, чтобы убедиться, что они действительно считывают одни и те же данные (что должно привести к одному и тому же хэшу MD5).

Тогда я бы предложил опубликовать код здесь, чтобы мы могли его просмотреть.

person msun    schedule 24.06.2013
comment
Привет, я попробовал следующее: взял каждый символ и напечатал номер юникода. Отличие только в конце. Я использовал несколько разных PDF-файлов и проверил их с помощью vimdiff. PHP: 102 10 49 48 49 53 49 10 37 37 69 79 70 0 Javascript: 102 10 49 48 49 53 49 10 37 37 69 79 70 Теперь я немного запутался: string.length показывает одинаковый размер как на JS, так и на PHP. Также безуспешно пытался добавить String.fromCharCode(0) в конец содержимого JS. Редактировать: не могу заставить работать разрыв строки с двумя пробелами... - person marcellorvalle; 25.06.2013