16

DynamoDBにデータを書き込むLambda(NodeJS)関数があります。そのデータの一部は暗号化する必要があります。私はKMS暗号化と保存を使用して暗号化しています。別のラムダ関数を使用してDynamoから取得して復号化しようとすると、エラーが発生します。私が暗号化して復号化を回すと、私はそれを行うことができますが、私がDBから暗号化された値を読んでいれば、それは解読されません。 私の暗号化/店舗コードは以下の通りです:次のようにAmazon KMSを使用した値の暗号化、Lambda(NodeJS)を使用したDynamoDBの格納/取得

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

私の検索は/コードを復号化することである:

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

私はこのコードを実行すると、私は次のエラーを取得する:

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

暗号化された値を暗号化して復号化することはできますが、値を保存して取得して復号化しようとすると失敗します。どんな助けでも大歓迎です。

+0

['Binary'](http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DataModel.html#DataModel。 DataTypes.Binary)データ型を使用して暗号化されたデータを格納しますか?ドキュメントによれば、値をBase64形式でエンコードする必要もあります。 –

+0

ボリスに感謝します。どこにドキュメントがありますか?そのDynamoDBまたはKMSドキュメントですか?バイナリとストリングの両方のタイプを試しました。 – scoDubblT

+0

私は上記のリンクを投稿しました - http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DataModel.html#DataModel.DataTypes.Binary、 "バイナリタイプの属性は、たとえば圧縮されたバイナリデータを格納できますデータ、暗号化されたデータ、またはイメージ "..."クライアントアプリケーションは、Base64形式のバイナリ値をエンコードする必要があります。 " –

答えて

13

わかりました - 私はこれがうまくいきました。誰かが同じことで苦労しているかもしれない場合に備えて、私はここに投稿したかったのです。あなたはDynamoDBのにデータを入れたとき、あなたはこのようなものを使用します。私はそれを取得したときに

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

が、私は戻って文字列を取得していない、私は、オブジェクトを得ました。私はちょうど取り出された行と呼ばれる人を持っているときに、私は、このような値を取得する必要があります。

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

だから私は持っていた問題は、私がオブジェクトperson.First_Nameを渡すためにしようとしていたということです解読方法であり、person.First_Name.Sの値ではありません。

関連する問題