js跟java计算mad5不一致

今天碰到一个比较棘手的问题,经理要求上传文件同时上传文件的信息,信息包含文件的md5,后台会做文件完整性校验等,我用的跟以前一样的md5.js直接把在fileReader.onload中获取的文件流进行md5操作(代码如下),

$("#file1").change(function() {

var file = document.getElementById("file1").files[0];

var fileReader = new FileReader();

fileReader.readAsBinaryString(file);

fileReader.onload = function(e) {

console.log(md5(e.target.result)))

}

})

上传后报错,拿到后台生成的md5值进行比对发现跟我生成的不一样,网上找了N久最后发现是因为在js中是利用UTF-16编码的,而大多数计算md5值的方案都是基于二进制流的, 所以需要将js读出来的二进制流(已经被转换成UTF-16编码)还原成二进制流。最后的解决办法用的google的加密文件CryptoJS还原后再加密,下载地址:https://github.com/brix/crypto-js。下载后有N个文件,只需要以下两个文件就可以了。

上面代码改成

$("#file1").change(function() {

var file = document.getElementById("file1").files[0];

var fileReader = new FileReader();

fileReader.readAsBinaryString(file);

fileReader.onload = function(e) {

console.log(CryptoJS.MD5(CryptoJS.enc.Latin1.parse(e.target.result)))

//CryptoJS.enc.Latin1.parse(text)此方法是把文件还原成二进制流

}

})

你可能感兴趣的:(js跟java计算mad5不一致)