Я пытаюсь создать приложение, которое должно сравнить хэш MD5 любого файла. Из-за специфических проблем перед загрузкой MD5 должен быть сгенерирован клиентской стороной, а после загрузки приложение должно проверить его на стороне сервера.
Мой первый подход состоял в том, чтобы использовать на стороне клиента API файлов JavaScript и функции FileReader.ReadAs
. Затем я использую алгоритм MD5, найденный здесь: http://pajhome.org.uk/crypt/md5/
На стороне сервера я бы использовал команду fopen
PHP и функцию md5
.
Этот подход отлично работает при использовании простых текстовых файлов. Но, когда используется двоичный файл (например, jpg или pdf), MD5, сгенерированный на стороне клиента, отличается от сервера. Используя средство командной строки md5sum
я понял, что сервер MD5 верен, и проблема возникает на стороне клиента.
Я пробовал другие API MD5, которые я нашел с теми же результатами. Я подозреваю, что функции FileReader.ReadAs
немного по-другому загружают содержимое файла (я пробовал все ReadAs
функций ReadAs
: text, binary и т. Д.), Но я не могу понять, в чем разница.
Я что-то пропустил, но не знаю, что, может быть, мне нужно каким-то образом декодировать контент до создания 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 из двоичных файлов, пойдите для него.
Заранее спасибо!
http://membres-liglab.imag.fr/donsez/cours/exemplescourstechnoweb/js_securehash/
javascript md5 и php md5 оба одинаковы, но нам нужно использовать некоторые функции … эти функции мы можем получить с помощью выше url ….
Я бы предложил сделать быструю проверку здравомыслия: сообщите ли ваш код на стороне клиента первый и последний байты двоичных данных. Повторите в своем PHP-коде. Сравните первый и последний байты от обоих методов, чтобы убедиться, что они фактически читают одни и те же данные (что должно привести к тому же MD5-хешу).
Тогда я бы предложил здесь код отправки, чтобы мы могли просмотреть.