scan query nodejs node example dynamodb aws node.js amazon-web-services encryption amazon-dynamodb aws-lambda

node.js - query - Cifrado de valores utilizando Amazon KMS, almacenamiento/recuperación utilizando DynamoDB con Lambda(NodeJS)



dynamodb query example (1)

Tengo una función Lambda (NodeJS) que escribe datos en DynamoDB. Algunos de esos datos deben estar encriptados. Estoy encriptando usando cifrado KMS y almacenando. Cuando recupero de Dynamo usando una función Lambda diferente y trato de descifrar, recibo un error. Si cifro y luego doy vuelta a un descifrado, puedo hacerlo, pero si estoy leyendo el valor cifrado de la base de datos, no se descifra Mi código de cifrado / tienda está abajo:

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"); } }); } }); };

Mi código de recuperación / descifrado es el siguiente:

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); } }); } };

Cuando ejecuto este código, obtengo el siguiente error:

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),

Puedo cifrar y descifrar el valor cifrado, pero cuando almaceno el valor, lo recupero y trato de descifrarlo, falla. Cualquier ayuda sería muy apreciada.


Bien, tengo este trabajo y quería publicar aquí en caso de que alguien más esté luchando con lo mismo. Cuando pones datos en DynamoDB, usas algo como esto:

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

cuando lo recuperé, no recuperé una cadena, obtuve un objeto. Entonces, cuando tengo una fila llamada persona que acabo de recuperar, tengo que llegar al valor como este:

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

Así que el problema que estaba teniendo era que estaba tratando de pasar el objeto person.First_Name al método de descifrado y no el valor de person.First_Name.S