2013-11-28 3 views
3

Я пытаюсь получить md5sum файла tar для получения того же значения при использовании команды md5sum linux и метода MD5 CryptoJS.Получение md5sum файла через Crypto.js

В JavaScript я (после того, как файл был введен в HTML форме):

var reader = new FileReader(); 

reader.onloadend = function() { 
    text = (reader.result); 
} 

reader.readAsBinaryString(document.getElementById("firmware_firmware").files[0]); 

var hash = CryptoJS.MD5(text); 

hash.toString(); 

В Linux я:

md5sum name_of_file.tar 

В настоящее время эти две разные результаты. Как я могу получить JavaScript, чтобы содержимое tar-файла было MD5ed так же, как md5sum в Linux?

Для простой строки, md5sum и CryptoJS производят одинаковое значение.

Редактировать: С файлом Fred.txt с содержимым: «Fred», как md5sum, так и CryptoJS производят одинаковое значение: c624decb46fa3d60e824389311b252f6.

О файле update.tar, то md5sum на Linux дает мне: 1f046eedb7d8279953d233e590830e4f, на CryptoJS это дает мне: f0c3730e5a9863cffa0ba3fadd531788

edit2: Дальнейшее тестирование показывает, что это на самом деле проблема из-за большого размера файла, такие как 7 MegaBytes

+1

Можете ли вы привести примеры вывода обоих? Возможно ли, что 'readAsBinaryString (.....)' хеширует имя файла, а не содержимое файла? – DanFromGermany

+0

Спасибо за ответ, я протестировал его с помощью простого txt-файла с простой строкой, в этой ситуации md5sum на linux и CryptoJS дают тот же результат. Я буду редактировать результаты. – tblakey89

+0

Я также столкнулся с этой проблемой с CryptoJS.MD5(), и я нашел еще одну функцию Paul Johnston, которая дает правильный md5. Вы можете протестировать его в Интернете http://plink.link/39cc83f38263adee5bc655f11fbcefab/html – moldcraft

ответ

4

Все строки в JavaScript - даже «двоичные строки» - на самом деле являются UTF-16 символов. «Бинарная строка» - это та, которая предпочитает использовать только первые 256 кодовых точек. Поскольку кодировка Latin-1 также использует точно первые 256 кодовых точек, вы можете преобразовать строку в байты с использованием Latin-1.

var hash = CryptoJS.MD5(CryptoJS.enc.Latin1.parse(text)); 
0

Я думаю, это связано с тем, что файл не заканчивает загрузку, а хеш создается до того, как загрузка файла на 100%. Попробуйте переместить хэширования в onloadend события:

var reader = new FileReader(); 

reader.onloadend = function() { 
    var hash = CryptoJS.MD5(reader.result); 
    hash.toString(); 
} 

reader.readAsBinaryString(document.getElementById("firmware_firmware").files[0]); 
+0

Спасибо за ваш ответ, я попробовал, но это не сработало. Однако я ценю усилия. По результатам дальнейшего тестирования выясняется, что разные результаты возникают только для файлов размером в несколько мегабайт. Так что, может быть, по правильной линии, так как это на моей локальной машине и выполняется на стороне клиента, может ли загрузка действительно быть проблемой? – tblakey89

+0

Это также может быть связано с ограничением в 'php.ini' -' max_post_size' или 'max_upload_size' или тому подобное. Если файл будет загружен на 100%, хэш будет равен всем lib. (если вы используете php) – DanFromGermany

Смежные вопросы