在javascript中纠正所有文件类型的MD5哈希

时间:2017-05-17 23:20:53

标签: javascript md5

在此处使用图书馆:https://github.com/blueimp/JavaScript-MD5 我试图使用javascript正确地在MD5中散列文件。

到目前为止,我得到了正确的文本文件哈希,但如果我尝试哈希图像文件,我会得到一个不正确的哈希。

这可能是由于javascript FileReader如何读取较大的图像文件。我尝试过readAsBinaryString(),readAsArrayBuffer()和readAsText(),它们都没有提供给定库的正确哈希。

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

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);
}

1 个答案:

答案 0 :(得分:0)

现在有SubtleCrypto API及其subtle.digest方法。

由于MD5 is not considered secure anymore,您无法从此API获取MD5哈希值。

但您可以使用其他(更安全)算法获取哈希值,例如SHA。

&#13;
&#13;
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 : 
https://stackoverflow.com/questions/44036218/`)
      } else {
        console.log(e.message)
      }
    })
  fR.readAsArrayBuffer(f.files[0]);
}
&#13;
<input type="file" id="f">
&#13;
&#13;
&#13;