【问题标题】:SHA1 calculation returns wrong valueSHA1 计算返回错误值
【发布时间】:2015-09-22 07:52:16
【问题描述】:

我正在尝试使用 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 时,我通过在 files 字节数组上计算得到相同的结果,所以它表明我使用这个脚本得到的字节数组在某种程度上是不同的/部分的。

【问题讨论】:

  • 您为文件获取了什么 SHA1SUM?是 da39a3ee5e6b4b0d3255bfef95601890afd80709 吗?那将是一个空文件。尝试比较已知良好简单字符串的 javascript 输出。 “你好”应该产生 aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d。如果效果很好,则错误出在文件处理中。也许 JavaScript 不允许从磁盘加载文件。
  • 不,当我更改文件时结果会发生变化,它确实会根据与文件相关的内容计算 SHA1。
  • 发送文件内容时,是否使用了headerContent-Type: application/octet-stream
  • @neuhaus - hello 结果是正确的值,因为 CryptoJS.SHA1 函数做了它应该做的事情,问题确实在于处理文件。
  • @Mjh - 我尝试在 ajax 脚本中添加 contentType 但结果没有改变,为相同的文件生成了相同的 SHA1

标签: javascript ajax sha1 cryptojs


【解决方案1】:

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

【讨论】:

  • 尝试添加以下内容但结果相同:dataType: 'text'
【解决方案2】:

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

$(document).ready(function(){

var url = utils.getUrlVars() && utils.getUrlVars().url;

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

var oReq = new XMLHttpRequest();
oReq.open("GET", url, true);
oReq.responseType = "blob";

oReq.onreadystatechange = function(e) {

    if (oReq.readyState == 4 && oReq.status == 200) {
        console.log('xhr success');
        success(e);
    } else if (oReq.readyState == 4 && oReq.status != 200){
        console.log('xhr error');
        error(e);
    }
}

var success = function() {
    var blob = oReq.response; 
    var sha1 = CryptoJS.algo.SHA1.create(); 
    var reader = new FileReader();
    reader.readAsArrayBuffer(blob);

    reader.onload = function(e) {
        var arrbuffer = e.target.result.slice(0, e.target.result.byteLength);
        var bytes = CryptoJS.enc.u8array.parse(new Uint8Array(arrbuffer));
        sha1.update(bytes);
        var sha1res = sha1.finalize().toString(CryptoJS.enc.Hex);
        // print results
        console.log('sha1 - success', sha1res);
    }
};

var error = function(){
    IJavaScriptImplementer.onError(JSON.stringify(error));
    IJavaScriptImplementer.log(JSON.stringify(error));
}

oReq.send(null);
});

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多