我正在尝试使用CryptoJs在javascript中使用Java生成相同的结果。但我很多次失败了。我发现CryptoJs最近在javascript中生成哈希值。但是在javascript和java之间做出相同的结果是不合适的。我想从zip或xls,doc获取哈希值(校验和)。 Java应用程序必须检查它是否具有相同的哈希值。有谁知道我的javascript出了什么问题?
====== java source ==========
public static String getFileHashSHA256(String fileName) throws Exception {
int buff = 16384;
RandomAccessFile file = new RandomAccessFile(fileName, "r");
MessageDigest hashSum = MessageDigest.getInstance("SHA-256");
byte[] buffer = new byte[buff];
byte[] partialHash = null;
long read = 0;
long offset = file.length();
int unitsize;
while (read < offset) {
unitsize = (int) (((offset - read) >= buff) ? buff : (offset - read));
file.read(buffer, 0, unitsize);
hashSum.update(buffer, 0, unitsize);
read += unitsize;
}
file.close();
partialHash = new byte[hashSum.getDigestLength()];
partialHash = hashSum.digest();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < partialHash.length; i++) {
sb.append(Integer.toString((partialHash[i] & 0xff) + 0x100, 16).substring(1));
}
return sb.toString();
}
结果哈希值:2f3512d3caad7b43f0036bafa7c80e78e9fca6a253857d24b1c38dc5cdab1399
========= javascript source ==============
var fileToLoad = document.getElementById("fileToLoad").files[0];
var fileReader = new FileReader();
fileReader.readAsBinaryString(fileToLoad);
fileReader.onload = function(fileLoadedEvent)
{
var hash = CryptoJS.SHA256(fileLoadedEvent.target.result).toString();
console.log(hash);
};
结果哈希值:cc7cf3ed59fb26a43d2596e54c48bced09ad22bff68e2cb5a1ea7cc80b48387d
即使它来自同一个zip文件,这两个哈希值也是不同的。