2015-12-28 4 views
4

Загрузка файла в куски с использованием API Blob. Здесь я хочу проверить контрольную сумму md5 blob. Когда я попробовал приведенный ниже код, он отлично работает для текстовых файлов, но он возвращает другое значение для двоичных файлов.Как вычислить контрольную сумму md5 blob с использованием CryptoJS

var reader = new FileReader(); 
reader.readAsBinaryString(blob); 
reader.onloadend = function() { 
    var mdsum = CryptoJS.MD5(reader.result); 
    console.log("MD5 Checksum",mdsum.toString()); 
}; 

Как правильно вычислить контрольную сумму md5 blob для всех типов файлов?

+1

http://stackoverflow.com/questions/17819820/how-to-get-correct-sha1-hash-of-blob-using-cryptojs –

+0

Вы используете CryptoJS. Этот вопрос не имеет ничего общего с jQuery. –

+0

Помните, что MD5 считается «криптографически сломанным и непригодным для дальнейшего использования». Если вы не используете его для совместимости с внешним сервисом, рассмотрите возможность переключения на SHA-2 (SHA-256 и т. Д.). – jcaron

ответ

7

Используйте следующий код для создания правильного md5 хэш:

function calculateMd5(blob, callback) { 
    var reader = new FileReader(); 
    reader.readAsArrayBuffer(blob); 
    reader.onloadend = function() { 
     var wordArray = CryptoJS.lib.WordArray.create(reader.result), 
      hash = CryptoJS.MD5(wordArray).toString(); 
     // or CryptoJS.SHA256(wordArray).toString(); for SHA-2 
     console.log("MD5 Checksum", hash); 
     callback(hash); 
    }; 
    } 

Update (немного проще):

function calculateMd5(blob, callback) { 
    var reader = new FileReader(); 
    reader.readAsBinaryString(blob); 
    reader.onloadend = function() { 
     var hash = CryptoJS.MD5(reader.result).toString(); 
     // or CryptoJS.SHA256(reader.result).toString(); for SHA-2 
     console.log("MD5 Checksum", hash); 
     callback(hash); 
    }; 
    } 

Не забудьте включить core.js, lib-typedarrays.js (важно) и md5.js компонентов библиотеки CryptoJS.
Для получения полного примера см. Этот fiddle (из-за контроля доступа к источнику данных он не будет работать на скрипке, попробуйте на локальном сервере).

+0

вы должны определить метод 'onloadend' перед вызовом' readAsBinaryString' или 'readAsArrayBuffer': в противном случае с достаточно маленьким буфером вы можете получить обработчик события onloadend после регистрации события. – Thierry

+0

@Thierry Можете ли вы показать демо? Метод 'readAsBinaryString' запускает новую задачу в очереди, которая не выполняется в том же стеке, когда устанавливается' reader.onloadend' (как эффект цикла событий JavaScript). Поэтому порядок 'reader.readAsBinaryString' и' reader.onloadend' не имеет значения. –

+0

Ну, это случилось со мной сегодня днем ​​при использовании этого кода. Метод, вызывающий вызов 'onloadend', является' readAsBinaryString' (из mozilla: 'Когда операция чтения завершена, readyState становится DONE, а loadend запускается'), а в вашем коде вы регистрируете обработчик событий * после * метода, который его вызовет. Возможно, он будет работать 99% времени, но он тоже не сработает. Инвертирование обеих операций будет работать в каждом случае. – Thierry

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