前几天学习整理了Node.js的crypto模块,crypto模块实现了OpenSSL中相关加密码技术,可以用于文件啥希值计算、加密、解密、验证等。最近要做APP升级功能,为了验证APP文件的完整性,需要在服务端计算文件的MD5值,APP升级时会对文件的MD5值进行较验。
计算文件哈希值,需要使用crypto模块中的Hash类。Hash类是一个可读写的Stream流,要计算文件的哈希值首先要读取文件并创建一个Stream。在Node.js中,操作文件使用的fs模块。以下是一个计算文件MD5值的示例,代码如下:
var crypto = require('crypto');
var fs = require('fs');
//从文件创建一个可读流
var stream = fs.createReadStream('./mindpush.apk');
var fsHash = crypto.createHash('md5');
stream.on('data', function(d) {
fsHash.update(d);
});
stream.on('end', function() {
var md5 = fsHash.digest('hex');
console.log("文件的MD5是:%s", md5);
});
在上面的示例中,基于流事件监听创建并更新文件哈希流。hash.update方法,默认传入数据类型为Buffer。使用fs模块的fs.readFile或fs.readFileSync方法,可以从文件读取一个文件的Buffer。因此,以上代码可以简化为:
var crypto = require('crypto');
var fs = require('fs');
//读取一个Buffer
var buffer = fs.readFileSync('./mindpush.apk');
var fsHash = crypto.createHash('md5');
fsHash.update(buffer);
var md5 = fsHash.digest('hex');
console.log("文件的MD5是:%s", md5);
Hash类除可以计算文件MD5值外,还可用于计算文件的'sha1'、'sha256'、'sha512'等值,使用时修改crypto.createHash('md5')方法的传入参数即可。