如何使用CryptoJS计算Blob的MD5校验和

9
使用Blob API以分块方式上传文件。在这里,我想检查blob的md5校验和。当我尝试以下代码时,对于文本文件它运行良好,但对于二进制文件返回的值不同。
var reader = new FileReader();
reader.readAsBinaryString(blob);
reader.onloadend = function () {
    var mdsum = CryptoJS.MD5(reader.result);
    console.log("MD5 Checksum",mdsum.toString());
};

如何正确地计算所有类型文件的blob的md5校验和?

1
https://dev59.com/wXTYa4cB1Zd3GeqPy8_c - Mi-Creativity
你正在使用CryptoJS。这个问题与jQuery无关。 - Oleg V. Volkov
请注意,MD5被认为是“密码学上已经破解且不适合进一步使用”的。除非您必须使用它以与外部提供的服务兼容,否则请考虑切换到SHA-2(SHA-256等)。 - jcaron
https://dev59.com/VGIj5IYBdhLWcg3wHhpX#61823010 - Miguel
1个回答

16

使用以下代码创建正确的MD5哈希值:

  function calculateMd5(blob, callback) {
    var reader = new FileReader();
    reader.readAsArrayBuffer(blob);
    reader.onloadend = function () {
      var wordArray = CryptoJS.lib.WordArray.create(reader.result),
          hash = CryptoJS.MD5(wordArray).toString();
      // or CryptoJS.SHA256(wordArray).toString(); for SHA-2
      console.log("MD5 Checksum", hash);
      callback(hash);
    };
  }

更新(简化版):

 function calculateMd5(blob, callback) {
    var reader = new FileReader();
    reader.readAsBinaryString(blob);
    reader.onloadend = function () {
      var  hash = CryptoJS.MD5(reader.result).toString();
      // or CryptoJS.SHA256(reader.result).toString(); for SHA-2
      console.log("MD5 Checksum", hash);
      callback(hash);
    };
  }

请务必在CryptoJS库中包含core.js, lib-typedarrays.js重要)和md5.js组件。
请参见此示例以获取完整的示例(由于源访问控制,它无法在fiddle上运行,请在本地服务器上尝试)。


@Thierry,你能演示一下吗?readAsBinaryString方法会在队列中初始化一个新任务,在reader.onloadend设置的时候不会在同一堆栈中被执行(这是JavaScript事件循环的影响)。因此,reader.readAsBinaryStringreader.onloadend的顺序并不重要。 - Dmitri Pavlutin
@Thierry,你可以简单地给我演示一下来展示这个问题吗?因为读取操作会在队列中启动一个新任务,所以这些行的执行顺序并不重要。 规范 中说:使用 blob 参数作为输入启动一个带注释的任务读取操作,并按照以下方式处理在文件读取任务源上排队的任务。 - Dmitri Pavlutin
确实。我刚刚用 Chrome 进行了测试,它按预期工作。Firefox 显示了问题。可能是 Firefox 的 bug 吗? - Thierry
你能解释一下,为什么作者的代码是错误的吗?为什么不能只用 CryptoJS.MD5(reader.result); - sinbar
对我来说,使用这个代码产生了正确的结果:var hash = CryptoJS.MD5(CryptoJS.enc.Latin1.parse(reader.result)).toString(); - abhinav gajurel
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接