【发布时间】: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。
-
发送文件内容时,是否使用了header
Content-Type: application/octet-stream? -
@neuhaus - hello 结果是正确的值,因为 CryptoJS.SHA1 函数做了它应该做的事情,问题确实在于处理文件。
-
@Mjh - 我尝试在 ajax 脚本中添加 contentType 但结果没有改变,为相同的文件生成了相同的 SHA1
标签: javascript ajax sha1 cryptojs