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

Итак, что мне нужно: хэш MD5 или SHA-256 загруженного на мой сайт файла.

Насколько я понимаю, это работает: файл загружается с помощью тега HTML input типа "файл", после чего он преобразуется в двоичную строку, которая затем хешируется.

Что у меня есть на данный момент: мне удалось получить хеш ввода типа "текст", а также каким-то образом хэш загруженного файла, хотя хеш не совпадал с веб-сайтами, которые я посмотрел в Интернете, поэтому я предполагаю, что он хэшировал некоторые другие детали файла, а не двоичную строку.

Вопрос 1: Правильно ли я понимаю, как хешируется файл? То есть, хешируется ли это двоичная строка?

Вопрос 2: Как должен выглядеть мой код, чтобы загрузить файл, хэшировать его и отобразить результат?

Заранее спасибо.

0
Yakko Majuri 23 Сен 2018 в 19:42

1 ответ

Лучший ответ

В основном да, вот как это работает.
Но чтобы сгенерировать такой хеш, вам не нужно выполнять преобразование в строку самостоятельно. Вместо этого пусть SubtleCrypto API справится с этим самостоятельно, и просто передайте ArrayBuffer вашего файла.

async function getHash(blob, algo = "SHA-256") {
  // convert your Blob to an ArrayBuffer
  // could also use a FileRedaer for this for browsers that don't support Response API
  const buf = await new Response(blob).arrayBuffer();
  const hash = await crypto.subtle.digest(algo, buf);
  let result = '';
  const view = new DataView(hash);
  for (let i = 0; i < hash.byteLength; i += 4) {
     result += view.getUint32(i).toString(16).padStart(2, '0');
  }
  return result;
}
inp.onchange = e => {
  getHash(inp.files[0]).then(console.log);
};
<input id="inp" type="file">
0
Kaiido 27 Сен 2018 в 07:47