javascript - 在 Angularjs 应用程序和 bash 中使用相同文件的不同 SHA256

javascript - Different SHA256 using the same file in Angularjs app and bash

我需要在我的 AngularJS 应用程序中获取上传文件的摘要,但结果摘要与我通过 bash 获取的文件摘要不同。

我开始使用 jshashes, but when I saw that the resultant hash (on the web app) was different from the one which I get locally using bash I decided to move to CryptoJS。但是结果是一样的,上传文件的哈希还是不一样。

这是我的代码:

var reader = new FileReader();    
reader.readAsBinaryString(controller.file);
controller.fileHash = CryptoJS.SHA256(reader.result).toString(CryptoJS.enc.Hex);

如您所见,代码非常简单,只需使用 FileReader 从变量中读取上传的文件并将值转换为 BinaryString,对内容进行哈希处理,最后将结果分配给另一个控制器在 html.

中显示

在我的shell(本地环境)中获取文件摘要我运行以下命令:

$ shasum -a 256 [path/to/file]

为了上传文件,我正在使用 ng-file-upload

我错过了什么?如果有人可以帮助我或指导我查看解决方案,我将非常感激。

提前致谢。

更新 1: 正如@destroyer 在下面的评论中所说,readAsBinaryString 已被弃用,它是一种异步方法,所以这是我的实际代码:

var reader = new FileReader();
reader.onload = function() {
    controller.fileHash = CryptoJS.SHA256(reader.result).toString(CryptoJS.enc.Hex);
};
reader.readAsArrayBuffer(controller.file);

我尝试了 解决方案,以便将 ArrayBuffer 对象转换为 BinaryString。但是结果还是错了

更新 2: 这是我要散列的对象的控制台日志图像

readAsBinaryString is deprecated, you should use readAsArrayBuffer.

无论哪种方式,这些函数都会启动一个异步操作,您可以在 FileReader 实例的 load 事件中读取其结果。

var reader = new FileReader();    
reader.onload = function(){
  controller.fileHash = CryptoJS.SHA256(reader.result).toString(CryptoJS.enc.Hex);
};
reader.readAsArrayBuffer(controller.file);

回顾我们在评论中的对话:问题是 crypto-js 不对二进制文件进行操作,而是对字符串进行操作。

你可以直接在js-sha256.

中得到一个支持ArrayBuffers的SHA256实现