nodejs crypto.createha sh ('sha256') производит разные ha sh для одного и того же объекта S3 - PullRequest
0 голосов
/ 21 июня 2020

Каждый раз, когда я тестирую свой код, он выдает другой ha sh, хотя это тот же файл / объект из 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

Как вы можете видеть Результат Ha sh отличается для каждого теста.

Я знаю, что тест одинаковый.

Я знаю, что объект S3 такой же.

Я знаю, что ' м не очень с Nodejs. Подскажите, пожалуйста, что я делаю не так?

1 Ответ

0 голосов
/ 23 июня 2020

Я отдаю должное @keithRozario. Его комментарий заставил меня попробовать.

Как только я хэшировал тело, ха sh оставалось постоянным. Вот код:

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);
  } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...