为所有文件类型更正 javascript 中的 MD5 散列

Correct MD5 hash in javascript for all filetypes

在此处使用库:https://github.com/blueimp/JavaScript-MD5 我正在尝试使用 javascript.

在 MD5 中正确散列文件

到目前为止,我得到了文本文件的正确哈希值,但如果我尝试对图像文件进行哈希处理,我得到的哈希值不正确。

这可能是由于 javascript FileReader 读取较大图像文件的方式所致。我已经尝试过 readAsBinaryString()、readAsArrayBuffer() 和 readAsText() none,其中提供给定库的正确散列。

我应该如何读取文件以便为所有文件类型提供正确的散列,是否有更合适的库适用于我应该使用的所有文件类型?

HTML:

<input id="file-to-hash" type=file>
<button onclick="hashFile()">Hash</button>

Javascript:

function hashFile() {

 var file = document.getElementById('file-to-hash').files[0];

 var reader = new FileReader();
 reader.readAsArrayBuffer(file);
 reader.onload = readSuccess;
}

function readSuccess(evt){
 fileContents = evt.target.result;
 var hash = md5(fileContents);
}

现在有 SubtleCrypto API and its subtle.digest 方法。

您将无法从此 API 获得 MD5 哈希值,因为 MD5 is not considered secure anymore

但是您将能够使用其他(更安全的)算法(例如 SHA)获得哈希。

function getHash(buffer, algo = "SHA-256") {
  return crypto.subtle.digest(algo, buffer)
    .then(hash => {
      // here hash is an arrayBuffer, so we'll convert it to its hex version
      let result = '';
      const view = new DataView(hash);
      for (let i = 0; i < hash.byteLength; i += 4) {
        result += ('00000000' + view.getUint32(i).toString(16)).slice(-8);
      }
      return result;
    });
}

f.onchange = e => {
  const fR = new FileReader();
  fR.onload = e => getHash(fR.result)
    .then(hash => console.log(hash))
// Chrome only accept it from an secure origin
    .catch(e => {
      if (e.code === 9) {
        console.log(`Be sure to be on the https page : 

      } else {
        console.log(e.message)
      }
    })
  fR.readAsArrayBuffer(f.files[0]);
}
<input type="file" id="f">