Node.js nodejs crypto.createhash(';sha256';)为同一S3对象生成不同的哈希

Node.js nodejs crypto.createhash(';sha256';)为同一S3对象生成不同的哈希,node.js,amazon-s3,aws-lambda,node-crypto,Node.js,Amazon S3,Aws Lambda,Node Crypto,每次我测试代码时,它都会生成不同的散列,即使它是来自S3的相同文件/对象。这是我的密码: "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"

每次我测试代码时,它都会生成不同的散列,即使它是来自S3的相同文件/对象。这是我的密码:

"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对象是相同的


我知道我对nodej不太好。有人能告诉我我做错了什么吗?

我相信@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);
  } 
}

我不是NodeExpert,但可能是在散列来自S3的响应,而不是文件内容本身。来自S3的响应将包括各种元数据等,因此每次都会导致哈希值不同。只是一个猜测。这看起来确实有可能。虽然我没有更改测试事件输入,但它不应该仍然是相同的散列吗?s3对象的元数据会因为我执行了getObject而改变吗?@keithRozario看起来你是对的。我确保只对对象的主体进行散列,并且散列保持不变!:-)如果你能回答我的意见,我会很乐意把它奖励给你。