16

Tôi có hàm Lambda (NodeJS) ghi dữ liệu vào DynamoDB. Một số dữ liệu đó cần được mã hóa. Tôi đang mã hóa bằng cách sử dụng mã hóa và lưu trữ KMS. Khi tôi lấy lại từ Dynamo sử dụng một hàm Lambda khác và cố gắng giải mã, tôi nhận được một lỗi. Nếu tôi mã hóa và sau đó quay lại giải mã, tôi có thể làm điều đó, nhưng nếu tôi đọc giá trị được mã hóa từ DB, nó sẽ không giải mã được. mã hóa/cửa hàng Mã của tôi là dưới đây:Mã hóa giá trị bằng cách sử dụng Amazon KMS, lưu trữ/truy xuất bằng DynamoDB với Lambda (NodeJS)

console.log('Loading event'); 

var AWS = require('aws-sdk'); 

var keyId = "arn:aws:kms:us-east-1:5423542542:key/xxxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxxx"; 
var tableName = "person"; 
var dynamoDBConfiguration = { 
    "region": "us-west-2" 
}; 
AWS.config.update(dynamoDBConfiguration); 
var dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'}); 
var kms = new AWS.KMS({region: 'us-east-1'}); 
var newId = "1234-56789-101112-13141516"; 
var item = {}; 

exports.handler = function (event, context) { 
    console.log('ssn'); 
    //encrypt it 
    var ssnParams = { 
     KeyId: keyId, 
     Plaintext: "123-45-6789" 
    }; 
    kms.encrypt(ssnParams, function (err, data) { 
     if (err) { 
      console.log(err, err.stack); 
     } 
     else { 
      console.log(' ssn encrypted'); 

      var enc_ssn = data.CiphertextBlob; 
      item["SSN"] = {"Value": {"B": enc_ssn}}; 
      item["First_Name"] = {"Value": {"S": "Joe"}}; 
      item["Last_Name"] = {"Value": {"S": "Blow"}}; 
      dynamodb.updateItem({ 
       "TableName": tableName, 
       "AttributeUpdates": item, 
       "ReturnValues": "ALL_NEW", 
       "Key": { 
        "id": {"S": newId} 
       } 

      }, function (err, data) { 
       if (err) { 
        context.done(err); 
       } 
       else { 
        console.log('great success: %j', data); 
        context.succeed("Person Successfully Inserted"); 
       } 
      }); 
     } 
    }); 
}; 

hồi My/giải mã mã như sau:

console.log('Loading event'); 
var AWS = require('aws-sdk'); 
var dynamoDBConfiguration = { 
    "region": "us-west-2" 
}; 
AWS.config.update(dynamoDBConfiguration); 
var dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'}); 
var keyId = "arn:aws:kms:us-east-1:5423542542:key/xxxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxxx"; 
var tableName = "person"; 
var kms = new AWS.KMS({region: 'us-east-1'}); 

exports.handler = function (event, context) { 
    console.log(JSON.stringify(event, null, ' ')); 
    var params = {}; 
    var id = event.id; 
    console.log(id); 
    if (id && id !== '') { 
     params = { 
      "TableName": tableName, 
      KeyConditionExpression: "id = :id", 
      ExpressionAttributeValues: { 
       ':id': {'S': id} 
      } 
     }; 
     dynamodb.query(params, function (err, data) { 
      if (err) { 
       context.done(err); 
      } 
      else { 
       var person = data.Items[0]; 
       console.log('query success'); 
       console.log(person); 
       if (person.SSN) { 
        console.log('have ssn'); 
        var b_ssn = person.SSN; 
        console.log(b_ssn); 
        person.SSNtext = ""; 
        var encryptedParams = { 
         CiphertextBlob: Buffer(b_ssn, 'base64'), 
        }; 
        kms.decrypt(encryptedParams, function (err, decrypteddata) { 
         if (err) { 
          console.log(err, err.stack); 
          //context.done(err); 
         } 
         else { 
          person.SSNtext = decrypteddata.Plaintext.toString(); 
          console.log(decrypteddata.Plaintext.toString()); 
          context.succeed(person); 
         } 
        }); 
       } 
      } 
     }); 
    } 
    else { 
     params = { 
      "TableName": tableName 
     }; 
     dynamodb.scan(params, function (err, data) { 
      if (err) { 
       context.done(err); 
      } 
      else { 
       console.log('scan success'); 
       context.succeed(data); 
      } 
     }); 
    } 
}; 

Khi tôi chạy mã này, tôi nhận được lỗi sau:

START RequestId: 639590ac-cb95-11e5-91e4-d706c725f529 Version: $LATEST 
2016-02-04T23:16:58.713Z 639590ac-cb95-11e5-91e4-d706c725f529 Loading event 
2016-02-04T23:17:00.215Z 639590ac-cb95-11e5-91e4-d706c725f529 { 
    "id": "1234-56789-101112-13141516" 
} 
2016-02-04T23:17:00.215Z 639590ac-cb95-11e5-91e4-d706c725f529 1234-56789-101112-13141516 
2016-02-04T23:17:00.954Z 639590ac-cb95-11e5-91e4-d706c725f529 query success 
2016-02-04T23:17:00.954Z 639590ac-cb95-11e5-91e4-d706c725f529 { Last_Name: { S: 'Blow' }, 
    id: { S: '1234-56789-101112-13141516' }, 
    First_Name: { S: 'Joe' }, 
    SSN: { B: <Buffer 0a 20 ec 00 75 21 f2 61 7d ba 2e 38 7e c6 fd 24 6d 32 b4 c2 b3 29 47 9e 9b 97 f2 a8 46 f2 d0 38 da 37 12 92 01 01 01 02 00 78 ec 00 75 21 f2 61 7d ba 2e ...> } } 
2016-02-04T23:17:00.956Z 639590ac-cb95-11e5-91e4-d706c725f529 have ssn 
2016-02-04T23:17:00.956Z 639590ac-cb95-11e5-91e4-d706c725f529 { B: <Buffer 0a 20 ec 00 75 21 f2 61 7d ba 2e 38 7e c6 fd 24 6d 32 b4 c2 b3 29 47 9e 9b 97 f2 a8 46 f2 d0 38 da 37 12 92 01 01 01 02 00 78 ec 00 75 21 f2 61 7d ba 2e ...> } 
2016-02-04T23:17:01.573Z 639590ac-cb95-11e5-91e4-d706c725f529 { [InvalidCiphertextException: null] 
    message: null, 
    code: 'InvalidCiphertextException', 
    time: Thu Feb 04 2016 23:17:01 GMT+0000 (UTC), 

Tôi có thể mã hóa và giải mã giá trị được mã hóa, nhưng khi tôi lưu trữ giá trị, truy xuất nó và cố gắng giải mã nó, nó không thành công. Mọi sự trợ giúp sẽ rất được trân trọng.

+0

Bạn đang sử dụng ['Binary'] (http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DataModel.html#DataModel. DataTypes.Binary) kiểu dữ liệu để lưu trữ dữ liệu được mã hóa? Theo tài liệu, bạn cũng cần mã hóa giá trị theo định dạng Base64. –

+0

Cảm ơn bạn đã phản hồi Boris. Bạn đang thấy tài liệu ở đâu? Đó có phải là tài liệu DynamoDB hoặc KMS không? Tôi đã thử cả hai loại nhị phân và chuỗi. – scoDubblT

+0

Tôi đã đăng liên kết ở trên - http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DataModel.html#DataModel.DataTypes.Binary, nó nói "Thuộc tính loại nhị phân có thể lưu trữ bất kỳ dữ liệu nhị phân nào, ví dụ nén dữ liệu, dữ liệu được mã hóa hoặc hình ảnh "..." Ứng dụng của khách hàng phải mã hóa các giá trị nhị phân ở định dạng Base64 " –

Trả lời

13

OK - Tôi đã làm việc này và tôi muốn đăng ở đây trong trường hợp người khác có thể đang vật lộn với cùng một điều. Khi bạn đặt dữ liệu vào DynamoDB, bạn sử dụng một cái gì đó như thế này:

item["First_Name"] = {"Value":{"S": "Joe"}}; 

khi tôi lấy lại, tôi đã không nhận được một chuỗi trở lại, tôi có một đối tượng. Vì vậy, khi tôi có một hàng gọi là người mà tôi chỉ lấy ra, tôi phải sau đó nhận được với giá trị như thế này:

first_name = person.First_Name.S; 
//results in first_name = "Joe"; 

Vì vậy, vấn đề tôi gặp phải là tôi đã cố gắng để vượt qua các đối tượng để person.First_Name phương thức giải mã và không phải là giá trị của con người.First_Name.S

Các vấn đề liên quan