【问题标题】:stream the contents of an S3 object into hash algorithm node.js将 S3 对象的内容流式传输到哈希算法 node.js
【发布时间】:2022-02-16 20:00:39
【问题描述】:

我是 node.js 的新手,我正在尝试编写一个 AWS lambda 函数,它将 s3 对象的内容流式传输到节点的加密模块中,以创建 s3 对象的 md5 校验和值。不知道为什么,但每次我运行代码时,它都会在 console.log 上生成不同的哈希值。谁能指出我正确的方向来修复我的代码?感谢帮助!

var crypto = require('crypto');
var fs = require('fs');
var AWS = require('aws-sdk'); 
var s3 = new AWS.S3(); 

exports.handler = (event, context, callback) => {

 var params = {
    Bucket: 'bucket_name',
    Key: 'key', 
 };

var hash = crypto.createHash('md5');
var stream = s3.getObject(params, function(err, data) {
  if (err){
    console.log(err);
    return;
  }
}).createReadStream();

stream.on('data', function (data) {
    hash.update(data, 'utf-8')
})

stream.on('end', function () {
    console.log(hash.digest('hex'))
})

};

【问题讨论】:

    标签: node.js aws-lambda md5


    【解决方案1】:

    你很亲密。您正在将“回调”样式方法签名与“createReadStream”签名混合。试试这个:

    const crypto = require('crypto');
    const fs = require('fs');
    const AWS = require('aws-sdk');
    const s3 = new AWS.S3();
    
    exports.handler = (event, context, callback) => {
      let params = {
        Bucket: 'bucket_name',
        Key: 'key',
      };
    
      let hash = crypto.createHash('md5');
      let stream = s3.getObject(params).createReadStream();
      stream.on('data', (data) => {
        hash.update(data);
      });
    
      stream.on('end', () => {
        let digest = hash.digest('hex');
        console.log(digest);
        callback(null, digest);
      });
    };
    

    【讨论】:

    • 我如何获得 Object Body 而不是整个对象的哈希?
    • 我明白了:let hash = crypto.createHash('sha256');然后在 getObject 的回调中让 hashResult = hash.update(data.Body).digest('hex');
    【解决方案2】:

    不是直接的答案,但您也可以在将文件上传到 S3 时添加 md5 作为 ETag。

    const crypt = require('crypto');
    const fs = require('fs').promises;
    
    const aws = require('aws-sdk');
    
    async function uploadFileToS3WithMd5Hash(bucket, filename, s3Key = null) {
      const data = await fs.readFile(filename);
      const md5Base64 = crypt.createHash("md5").update(data).digest('base64');
    
      if (!s3Key) {
        s3Key = filename;
      }
    
      /** Should you want to get the MD5 in hex format: */
      // const md5Hex = Buffer.from(md5Base64, 'base64').toString('hex');
    
      return new Promise((res, rej) => {
        const s3 = new aws.S3();
        s3.putObject({
          Bucket: bucket,
          Key: s3Key,
          Body: data,
          ContentMD5: md5Base64,
        }, (err, resp) => err ? rej(err) : res(resp));
      })
    }
    
    uploadFileToS3WithMd5Hash('your-own-bucket', 'file.txt')
      .then(console.log)
      .catch(console.error);
    

    因此,通过检查 S3 上的对象的 ETag,您将获得文件 MD5 哈希的十六进制字符串。

    在某些情况下 (see this post by Dennis),上传时会自动计算 MD5 校验和。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-06
      • 1970-01-01
      • 2011-06-30
      相关资源
      最近更新 更多