16

Ho una funzione Lambda (NodeJS) che scrive i dati su DynamoDB. Alcuni di questi dati devono essere crittografati. Sto crittografando usando KMS per cifrare e archiviare. Quando recupero da Dynamo utilizzando una funzione Lambda diversa e provo a decodificare, viene visualizzato un errore. Se crittografo e poi rigirino un decrypt, sono in grado di farlo, ma se sto leggendo il valore crittografato dal DB, non lo decodificherà. mio criptare il codice/negozio è qui sotto:Crittografia dei valori tramite Amazon KMS, memorizzazione/recupero con DynamoDB con 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"); 
       } 
      }); 
     } 
    }); 
}; 

mio recupero/decriptare il codice è il seguente:

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

Quando ho eseguito questo codice, ottengo il seguente errore:

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

Posso crittografare e decrittografare il valore crittografato, ma quando memorizzo il valore, lo recupero e cerco di decodificarlo, fallisce. Qualsiasi aiuto sarebbe molto apprezzato.

+0

Si sta utilizzando il ['Binary'] (http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DataModel.html#DataModel. DataTypes.Binary) tipo di dati per memorizzare i dati crittografati? Secondo i documenti, devi anche codificare il valore nel formato Base64. –

+0

Grazie per la risposta Boris. Dove lo vedete nei documenti? Sono documenti di DynamoDB o KMS? Ho provato entrambi i tipi di binario e stringa. – scoDubblT

+0

Ho pubblicato il collegamento sopra: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DataModel.html#DataModel.DataTypes.Binary, si dice "Gli attributi di tipo binario possono memorizzare qualsiasi dato binario, ad esempio compresso dati, dati crittografati o immagini "..." Le applicazioni client devono codificare valori binari in formato Base64 " –

risposta

13

Okay: ho funzionato e volevo postare qui nel caso in cui qualcun altro stia lottando con la stessa cosa. Quando si mettono i dati in DynamoDB, si utilizza qualcosa di simile:

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

quando ho recuperato, io non ha ottenuto una stringa di nuovo, ho ricevuto un oggetto. Così, quando ho una persona chiamata riga che ho appena recuperato, devo poi raggiungere il valore in questo modo:

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

Quindi il problema che stavo avendo è che stavo cercando di passare l'oggetto da person.First_Name il metodo decrypt e non il valore di person.First_Name.S