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

时间:2018-12-31 12:16:17

标签: javascript hash sha256 sjcl

我正在尝试使用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]);

有人可以帮我解决问题吗

1 个答案:

答案 0 :(得分:1)

您应该将 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