Расчетный MD5-хэш на стороне клиента с использованием CryptoJS отличается от расчета терминала - PullRequest
0 голосов
/ 13 июня 2019

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

Часть Javascript:

if (input.files && input.files[0]) {
    let reader = new FileReader();
    reader.onload = (e) => {
       let data = e.target.result;      
       var hashed = CryptoJS.MD5(data);
       console.log('hashed: ' + hashed);
    }
    reader.readAsDataURL(input.files[0]);
}

Тем не менее, приведенный выше код дает мне другой хеш, как терминал ( md5sum ). Терминал дает мне тот же хэш, что и различные онлайн-конвертеры.

То же самое сЯ попробовал алгоритмы SHA1 и SHA256.

Пример: Это изображение из Википедии дает следующие хэши.

Terminal: e5d23cb99614778b2acb163b8ee90810

CryptoJS: 468641711626fcfe6d956ddb21ccd4c7

1 Ответ

1 голос
/ 13 июня 2019

readAsDataURL() собирается вернуть строку base64 (с преамбулой URI данных), так что это то, что вы хэшируете, однако инструмент терминала MD5 просто будет читать необработанные байты и хэшировать их как есть.

Для исправления используйте:

reader.readAsArrayBuffer(input.files[0]);

для выборки необработанных байтов и:

var hashed = CryptoJS.MD5(CryptoJS.lib.WordArray.create(data));

чтобы передать их CryptoJs в формате, который он может обработать.

...