在此处使用图书馆: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);
}
答案 0 :(得分:0)
现在有SubtleCrypto API及其subtle.digest
方法。
由于MD5 is not considered secure anymore,您无法从此API获取MD5哈希值。
但您可以使用其他(更安全)算法获取哈希值,例如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 :
https://stackoverflow.com/questions/44036218/`)
} else {
console.log(e.message)
}
})
fR.readAsArrayBuffer(f.files[0]);
}
&#13;
<input type="file" id="f">
&#13;