繁体   English   中英

如何使用 sjcl.hash.sha256.hash 对文件内容执行 sha256 哈希?

[英]How to perform sha256 hash using sjcl.hash.sha256.hash on a file content?

我正在尝试使用 javascript 对文件内容执行 SHA256 哈希。

我使用以下函数获取文件

var fileReader = new FileReader();
var fileByteArray = [];
fileReader.onload = function(evt) {
    if (evt.target.readyState == FileReader.DONE) {
        var arrayBuffer = evt.target.result,
        array = new Uint8Array(arrayBuffer);
        fileHash = generateHashOfFileContent(array); 
        console.log('fileHash1: ' + fileHash);
    }
}
fileReader.readAsArrayBuffer(this.files[0]);

哈希函数是

function generateHashOfFileContent(fileData){
  var bitArray = sjcl.hash.sha256.hash(fileData);
  var digest_sha256 = sjcl.codec.hex.fromBits(bitArray);
  console.log("Sha256 "+digest_sha256);
  return digest_sha256;
}

但是当我选择一个二进制文件时它会产生错误的哈希数据

我只能使用文本文件生成实际哈希并更改fileReader.readAsArrayBuffer(this.files[0]); ------> fileReader.readAsText(this.files[0]);

有人可以帮我解决问题吗

您应该将TypedArray转换为bitArray

var fileReader = new FileReader();
var fileByteArray = [];
fileReader.onload = function(evt) {
    if (evt.target.readyState == FileReader.DONE) {
        var arrayBuffer = evt.target.result,
        array = new Uint8Array(arrayBuffer);
        let bitArray = sjcl.codec.bytes.toBits(array)
        fileHash = generateHashOfFileContent(bitArray); 
        console.log('fileHash1: ' + fileHash);
    }
}
fileReader.readAsArrayBuffer(this.files[0]);

请参阅https://github.com/bitwiseshiftleft/sjcl/wiki/Codecs

如果查看sha256.hash()函数,您会发现它试图将输入的data转换为Uint32Array 这是FileReader返回的arrayBuffer的有效操作。 因此,假设浏览器的typeof Uint32Array !== 'undefined'计算为true应该true ),则可以将arrayBuffer传递给hash()函数:

var fileReader = new FileReader();
var fileByteArray = [];
fileReader.onload = function(evt) {
    if (evt.target.readyState == FileReader.DONE) {
        var arrayBuffer = evt.target.result,
        fileHash = generateHashOfFileContent(arrayBuffer); 
        console.log('fileHash1: ' + fileHash);
    }
}
fileReader.readAsArrayBuffer(this.files[0]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM