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

时间:2018-04-24 09:41:16

标签: javascript angularjs sha256 cryptojs ng-file-upload

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

我开始使用jshashes,但是当我看到结果哈希(在网络应用上)与我在本地使用bash的哈希不同时,我决定转移到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);

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

更新2 : 这是一个控制台日志的图像,我想要哈希的对象 File object console.log

1 个答案:

答案 0 :(得分:1)

不推荐使用

readAsBinaryString,您应该使用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获得支持ArrayBuffer的SHA256实现。