【问题标题】:javascript - Different SHA256 using the same file in Angularjs app and bashjavascript - 在 Angularjs 应用程序和 bash 中使用相同文件的不同 SHA256
【发布时间】:2018-04-25 00:54:05
【问题描述】:

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

我开始使用jshashes,但是当我看到生成的哈希(在网络应用程序上)与我在本地使用 bash 获得的不同时,我决定转移到CryptoJS。但是结果是一样的,上传文件的hash还是不一样的。

这是我的代码:

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 在下面的cmets 中所说,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: 这是控制台日志的图像以及我要散列的对象

【问题讨论】:

  • 我们能看到“本地”代码吗?
  • @destoryer 我刚刚编辑了这个问题。总结一下,在我的本地环境中我运行这个命令:$ shasum -a 256 [path/to/file]
  • 我删除了我的答案,因为我似乎无法帮助你:我过去在ArrayBuffers 上使用过js-sha256,没有任何问题。
  • @destroyer 你做到了...非常感谢。有用。我花了几天时间试图解决它,我不知道为什么我直到现在才找到这个库,但它确实有效!如果你写的答案只包含图书馆的链接,我会投票。
  • 很高兴为您提供帮助,答案已更新。

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


【解决方案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);

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

您可以直接在js-sha256 中获得支持ArrayBuffers 的SHA256 实现。

【讨论】:

  • @destroyer 你是对的。我的错。对不起。即使结果仍然是错误的。我尝试按照此 (stackoverflow.com/a/32556944/2132144) 响应中的说明将结果转换为二进制字符串,但结果仍然错误。我不知道我做错了什么。
  • 您确定controller.fileFileBlob
  • @destroyer 是的,我很确定它是一个文件。我将使用对象的console.log 图像更新原始问题。请检查一下。
  • 我想到的还有一件事 - 尝试删除 .toString(CryptoJS.enc.Hex)
  • @destroyer 输出是一个 WordArray 对象。 Teh 文档说您需要转换为字符串 callint .toString 方法并传递编码器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-29
  • 2019-11-13
  • 2022-10-07
相关资源
最近更新 更多