SHA1计算返回错误的值

时间:2015-09-22 07:52:16

标签: javascript ajax sha1 cryptojs

我正在尝试使用javascript计算文件的SHA1值。 该文件与index.html位于同一目录中,并使用ajax作为查询参数给出的名称加载。

例如,调用http://localhost:7070/index.html?file=file.zip应该为file.zip计算SHA1

以下代码计算SHA1 ,但结果不同,而不是使用此SHA1在线工具并上传文件http://onlinemd5.com/

$(document).ready(function(){
   var file = utils.getUrlVars() && utils.getUrlVars().file;

   if (!file) throw "error - no URL was found. set 'file' in query string.";

   $.ajax({

       url: file,
       success: function(data){
           var sha1= CryptoJS.SHA1(data).toString();
           console.log('sha1 - success', sha1);
       },
       error: function(error){
           console.log('ERROR');
       }

   })
});

有什么区别?我猜这个在线工具正确计算它(它也给了我在使用Java代码计算时得到的确切结果),所以这个JS代码中的某些内容略有不同。

问题绝对不在CryptoJS包中,因为在计算字符串' hello'使用该脚本生成以下输出:

sha1 - success aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d

使用在线工具可以得到相同的结果(大写):

AAF4C61DDCC5E8A2DABEDE0F3B482CD9AEA9434D

问题绝对是加载后的数据格式或使用方式。

当我使用Java计算SHA1时,我通过在文件字节数组上计算得到相同的结果,因此它指出我使用这个脚本的字节数在某种程度上是不同的/部分的。

2 个答案:

答案 0 :(得分:0)

根据the manual for .ajax,您需要将dataType选项设置为text,否则会尝试猜测类型,然后text永远不是一个选项。

答案 1 :(得分:0)

我们最终设法解决了这个问题,解决方案是纯JS,没有涉及Ajax:

{{1}}

正如您所看到的那样,文件被作为一个blob请求并且正在被读取为一个切片(您也可以逐片切片,但在我的情况下文件很小),然后读取字节并计算到SHA1值。