nodejs crypto.createhash('sha256') 为同一个 S3 对象生成不同的散列

nodejs crypto.createhash('sha256') produces different hash for the same S3 object

每次我测试我的代码时,它都会生成不同的哈希值,即使它与 S3 中的相同 file/object。这是我的代码:

"use strict";
var crypto = require('crypto');
let AWS    = require("aws-sdk/global");
AWS.config.update({region: "us-east-1"});
let S3 = require("aws-sdk/clients/s3");
let s3 = new S3();

const successResponse = { statusCode: 200, body: JSON.stringify('Processed File Metadata successfully')};

// Main Lambda entry point
exports.handler = (event, context, callback) => {
  context.callbackWaitsForEmptyEventLoop = false;

  var bucketName = event.Records[0].s3.bucket.name;
  var objectKey  = event.Records[0].s3.object.key;

  getS3ObjectHash(bucketName, objectKey, function(err, s3ObjectHash){
    if(err){
      console.log("Error getting S3ObjectHash"+err.message);
      return callback(err);
    }else{
      return callback(null, successResponse);
    }
  });
};

async function getS3ObjectHash(srcBucket, srcKey, callback){
  let hashResult;
  try {
    console.log("Bucket "+srcBucket);
    console.log("Key "+srcKey);
    const params = {
      Bucket: srcBucket,
      Key: srcKey
    };
      // Creating Hash to be used as the Key for S3 Object
    let hash = crypto.createHash('sha256');
    
    let stream = s3.getObject(params, function(err, data){
      if(err){
        console.log(err);
        return;
      }
    }).createReadStream();
    stream.on('data', function(data){
      hash.update(data, 'binary');
    });
    stream.on('end', function(){
      hashResult = hash.digest('hex');
      console.log("**** Result hash "+ hashResult);
    return callback(null, hashResult);
    });
  } catch (error) {
      console.log("Caught error "+ error.message);
      return callback(error);
  } 
}

这是我使用的测试数据。是创建对象时的S3触发事件:

{
  "Records": [
    {
      "eventVersion": "2.1",
      "eventSource": "aws:s3",
      "awsRegion": "us-east-2",
      "eventTime": "2019-09-03T19:37:27.192Z",
      "eventName": "ObjectCreated:Put",
      "userIdentity": {
        "principalId": "AWS:PRINCIPAL-ID"
      },
      "requestParameters": {
        "sourceIPAddress": "205.255.255.255"
      },
      "responseElements": {
        "x-amz-request-id": "D82B88E5F771F645",
        "x-amz-id-2":  "vlR7PnpV2Ce81l0PRw6jlUpck7Jo5ZsQjryTjKlc5aLWGVHPZLj5NeC6qMa0emYBDXOo6QBU0Wo="
      },
      "s3": {
        "s3SchemaVersion": "1.0",
        "configurationId": "828aa6fc-f7b5-4305-8584-487c791949c1",
        "bucket": {
          "name": "BUCKET-NAME",
          "ownerIdentity": {
            "principalId": "PRINCIPAL-ID"
      },
          "arn": "arn:aws:s3:::BUCKET-NAME"
        },
        "object": {
          "key": "utp/1185481445975.nrcs143_023308.pdf",
          "size": 1305107,
          "eTag": "b21b84d653bb07b05b1e6b33684dc11b",
          "sequencer": "0C0F6F405D6ED209E1"
        }
      }
    }
  ]
}

这是使用上述相同测试数据进行的两次连续测试的输出

2020-06-21 INFO Key utp/1185481445975.nrcs143_023308.pdf
2020-06-21 INFO **** Result hash ea41e18defef3f4e44743d847ed804aa818afb33765d7ea83d0d2d92138e5946

2020-06-21 INFO Key utp/1185481445975.nrcs143_023308.pdf
2020-06-21 INFO **** Result hash b226d051e637f7627acbab588ab171eebefad412c797a7e7cf66e92f924e578f

如您所见,每个测试的结果哈希值都不同。

我知道考试也是一样

我知道S3对象是一样的

我知道我对 Nodejs 不太好。有人可以告诉我我做错了什么吗?

感谢@keithRozario。他的评论让我尝试了一下。

一旦我只对正文进行哈希处理,哈希值就保持不变。 这是代码:

async function getS3ObjectHash(srcBucket, srcKey, callback){
  let hashResult;
  try {const params = {Bucket: srcBucket,Key: srcKey};
    // getting the object so we get the hash
    s3.getObject(params, function(err, data){
      if(err){console.log(err);
        return;
      }
      let hash = crypto.createHash("sha256");
      hashResult = hash.update(data.Body).digest("hex");
      console.log("**** Result hash "+ hashResult);
      return callback(null, hashResult);
    });
  } catch (error) {
      console.log("Caught error "+ error.message);
      return callback(error);
  } 
}