Я пытаюсь создать приложение, которое должно сравнить хэш 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 из двоичных файлов, пойдите для него.
Заранее благодарен!
вы пробовали это? http://phpjs.org/functions/md5/ http://phpjs.org/functions/md5_file/ – bystwn22
Да, я тоже пробовал эту реализацию. Он генерирует одни и те же хэши. Я думаю, что я упускаю что-то относительно привязки содержимого файла. – marcellorvalle
Просто, чтобы проверить, вы не используете md5 для чего-то связанного с безопасностью, не так ли? – Simba