2013-06-24 3 views
3

Я пытаюсь создать приложение, которое должно сравнить хэш MD5 любого файла. В связи с конкретными проблемами перед загрузкой MD5 должен быть сгенерирован клиентской стороной, а после загрузки приложение должно проверить его на стороне сервера.Создайте тот же MD5 с помощью javascript и PHP

Мой первый подход состоял в том, чтобы использовать на стороне клиента API файлов JavaScript и функции FileReader.ReadAs. Затем я использую алгоритм MD5, который можно найти здесь: http://pajhome.org.uk/crypt/md5/

На стороне сервера я бы использовал команду PHP fopen и функцию md5.

Этот подход отлично работает при использовании простых текстовых файлов. Но, когда используется двоичный файл (например, jpg или pdf), MD5, сгенерированный на стороне клиента, отличается от сервера. С помощью утилиты командной строки md5sum я понял, что сервер MD5 верен, и проблема возникает на стороне клиента.

Я пробовал другие API MD5, которые я нашел с теми же результатами. Я подозреваю, что функции FileReader.ReadAs загружают содержимое файла несколько иначе (я пробовал все варианты функций: текст, бинарный и т. Д.), Но я не могу понять, в чем разница.

Я что-то пропустил, но не знаю, что, может быть, мне нужно каким-то образом декодировать контент до создания MD5.

Любые советы?

Edit 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 ...

Edit 2:

Слава Богу! Это воплощение работает как шарм: http://www.myersdaily.org/joseph/javascript/md5.js

Если вам нужно сгенерировать хэш MD5 из двоичных файлов, пойдите для него.

Заранее благодарен!

+0

вы пробовали это? http://phpjs.org/functions/md5/ http://phpjs.org/functions/md5_file/ – bystwn22

+1

Да, я тоже пробовал эту реализацию. Он генерирует одни и те же хэши. Я думаю, что я упускаю что-то относительно привязки содержимого файла. – marcellorvalle

+0

Просто, чтобы проверить, вы не используете md5 для чего-то связанного с безопасностью, не так ли? – Simba

ответ

0

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

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

+0

Привет, я попробовал следующее: взял каждый символ и напечатал номер юникода. В конце есть только одно различие. Я использовал несколько разных 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, так и на JS и PHP. Также попытался добавить «String.fromCharCode (0)» в конец содержимого JS без успеха. Изменить: не удается сделать двухстрочный разрыв строки ... – marcellorvalle

1

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

Javascript md5 и PHP md5 оба одинаково, но мы должны использовать некоторые функции ... что функции, которые мы можем получить из выше URL ....

+0

Ссылка только ответы обескуражены, отчасти потому, что ссылка может в конечном итоге сломаться, что делает ответ бесполезным. Пожалуйста, предоставьте какой-либо контекст из ссылки. – Robert

+0

Я должен поставить +1, потому что связанная реализация javascript является единственной, которая дала мне те же результаты, что и PHP с двоичными данными (пытается PhpJs, CryptoJs и некоторые другие), спасибо за сохранение моего дня. – Romain