Nodejs加密模块,hash.update()是否将所有输入存储在内存中

2023-12-12

我有一个 API 路由,可以代理从浏览器/客户端到 AWS S3 的文件上传。

此 API 路由尝试在上传文件时对其进行流式传输,以避免将文件的全部内容缓冲在服务器的内存中。

但是,该路由还会尝试计算文件正文的 MD5 校验和。当文件的每个部分都被分块时,hash.update()方法是通过块调用的。

http://nodejs.org/api/crypto.html#crypto_hash_update_data_input_encoding

var crypto = require('crypto');
var hash = crypto.createHash('md5');
function write (chunk) {
  // invoked many times as file is uploaded
  hash.update(chunk);
}
function done() {
  // will hash buffer all chunks in memory at this point?
  hash.digest('hex');
}

Hash 实例是否会缓冲文件的所有内容以执行哈希计算(从而违背了避免在内存中缓冲整个文件内容的目标)?或者可以增量计算 MD5 哈希值,而无需使用整个输入来执行计算?


MD5 和其他一些哈希函数都是基于Merkle–Damgård 构造。它支持数据的增量/渐进/流式哈希。将数据转换为内部状态(具有固​​定大小)后,执行最后一个最终确定步骤,通过填充和处理最后一个块,然后简单地返回最终状态来生成最终哈希。

这可能也是为什么许多哈希库函数以具有更新和最终确定步骤的方式设计的原因。

回答你的问题:不,文件内容不会保存在缓冲区中,而是会转换为固定大小的内部状态。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nodejs加密模块,hash.update()是否将所有输入存储在内存中 的相关文章

随机推荐