为所有文件类型更正 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">
在此处使用库: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">