Javascript SHA256使用Filereader问题对angular 6中的大型文件进行哈希

Javascript SHA256使用Filereader问题对angular 6中的大型文件进行哈希,javascript,angular,typescript,sha256,cryptojs,Javascript,Angular,Typescript,Sha256,Cryptojs,我对SHA256哈希有问题。如果文件大小超过250 MB,则会终止浏览器并崩溃。 下面是哈希代码,请帮助我们 let fileReader = new FileReader(); fileReader.readAsArrayBuffer(fileToSend); fileReader.onload = (e) => { const hash = CrypTo.SHA256(this.arrayBufferToWordArray(fileReader.result)).toStri

我对SHA256哈希有问题。如果文件大小超过250 MB,则会终止浏览器并崩溃。 下面是哈希代码,请帮助我们

let fileReader = new FileReader();
fileReader.readAsArrayBuffer(fileToSend);

  fileReader.onload = (e) => {
  const hash = CrypTo.SHA256(this.arrayBufferToWordArray(fileReader.result)).toString();
  this.hashCode=hash;
  this.fileHistory.MediaHash = hash;
  this.fileHistory.FileName = fileToSend.name;

  //Insert to file history
  this.fileHistoryService.postFiles(this.fileHistory).subscribe(
    data => {
      this.hashCode=data["MediaHash"];
      this.alertService.success('HASHFILE.FileUploadSuccessMessage', true);
      this.hideGenerateHashCodeButton = true;
    },
    error => {
       this.alertService.error('COMMONERRORMESSAGE.SomethingWentWrongErrorMessage');
  });

}

arrayBufferToWordArray(fileResult) {
    var i8a = new Uint8Array(fileResult);
    var byteArray = [];
    for (var i = 0; i < i8a.length; i += 4) {
      byteArray.push(i8a[i] << 24 | i8a[i + 1] << 16 | i8a[i + 2] << 8 | i8a[i + 3]);
    }
    return CrypTo.lib.WordArray.create(byteArray, i8a.length);
  }
let fileReader=new fileReader();
readAsArrayBuffer(fileToSend);
fileReader.onload=(e)=>{
const hash=CrypTo.SHA256(this.arrayBufferToWordArray(fileReader.result)).toString();
this.hashCode=hash;
this.fileHistory.MediaHash=hash;
this.fileHistory.FileName=fileToSend.name;
//插入到文件历史记录
this.fileHistoryService.postFiles(this.fileHistory).subscribe(
数据=>{
this.hashCode=data[“MediaHash”];
this.alertService.success('HASHFILE.fileuploadsuccessage',true);
this.hideGenerateHashCodeButton=true;
},
错误=>{
this.alertService.error('COMMONERRORMESSAGE.SomethingWentWrongErrorMessage');
});
}
ArrayBufferToOrdArray(文件结果){
var i8a=新的Uint8Array(fileResult);
var byteArray=[];
对于(变量i=0;ipush(i8a[i]您一定要使用streams或类似的东西,以避免将所有文件加载到内存中

具体使用,我已经看到可以执行渐进式散列

var sha256 = CryptoJS.algo.SHA256.create();
sha256.update("Message Part 1");
sha256.update("Message Part 2");
sha256.update("Message Part 3");
​
var hash = sha256.finalize();
因此,使用
FileReader
读取文件的部分内容,然后每次读取部分内容时,都会更新sha256,直到没有其他内容可读取为止


见:


下面是我为所有大文件测试的代码,修复了我的解决方案

var hashdata = CrypTo.algo.SHA256.create();
      var file =**<FiletoHash>**;
          if(file){
            var reader = new FileReader();
            var size = file.size;
            var chunk_size = Math.pow(2, 22);
            var chunks = [];

            var offset = 0;
            var bytes = 0;
        reader.onloadend = (e) =>{
              if (reader.readyState == FileReader.DONE){

               //every chunk read updating hash
                hashdata.update(this.arrayBufferToWordArray(reader.result));

                let chunk:any = reader.result;
                bytes += chunk.length;
                chunks.push(chunk);
                if((offset < size)){
                  offset += chunk_size;
                  var blob = file.slice(offset, offset + chunk_size);
                  reader.readAsArrayBuffer(blob);
                } else {
                  //use below hash for result
                  //finaly generating hash
                  var hash = hashdata.finalize().toString();

                 //debugger;
                };
              }
            };
            var blob = file.slice(offset, offset + chunk_size);
            reader.readAsArrayBuffer(blob);
          }

    }
  }

  arrayBufferToWordArray(fileResult) {
    var i8a = new Uint8Array(fileResult);
    return CrypTo.lib.WordArray.create(i8a, i8a.length);
  }
var hashdata=CrypTo.algo.SHA256.create();
var文件=***;
如果(文件){
var reader=new FileReader();
var size=file.size;
var chunk_size=Math.pow(2,22);
var chunks=[];
var偏移=0;
var字节=0;
reader.onloadend=(e)=>{
if(reader.readyState==FileReader.DONE){
//每个区块读取更新散列
update(this.arrayBufferToWordArray(reader.result));
let chunk:any=reader.result;
字节+=chunk.length;
推(chunk);
如果((偏移量<大小)){
偏移量+=块大小;
var blob=file.slice(偏移量,偏移量+块大小);
reader.readAsArrayBuffer(blob);
}否则{
//使用下面的散列作为结果
//最终生成散列
var hash=hashdata.finalize().toString();
//调试器;
};
}
};
var blob=file.slice(偏移量,偏移量+块大小);
reader.readAsArrayBuffer(blob);
}
}
}
ArrayBufferToOrdArray(文件结果){
var i8a=新的Uint8Array(fileResult);
返回CrypTo.lib.WordArray.create(i8a,i8a.length);
}

您提供的链接我尝试过了,但在typescript中不起作用。您能为typescript提供任何解决方案吗?我找到了这篇文章,它有帮助吗?:我尝试过用上述解决方案生成sha256哈希。但它给出的哈希不同。有谁能给我完整的解决方案NEUT解释的任何方法都是正确的,但在typescript I中我无法解决这个问题,请帮我解决。我了解了你的算法的大致思路。
字节
没有使用,这很奇怪。而且,如果你将每个结果存储在一个块中,你不是在内存中加载整个文件吗?为什么你要绑定
onloadend
而不是
onload
ater消除了对第一个
IF
的需要。