1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AWS Key Management Serviceで暗号化した文字列をNode.jsで復号する

1
Last updated at Posted at 2016-12-27

モチベーション

AWS Lambdaでチャットワークにつぶやく際に使うAPI keyを暗号化したいです。

作戦

AWS Key Management Service(以下KMS)を使います。
KMS上に保存したマスターキーでAPI keyを暗号化します。
暗号化したAPI keyはソースコードに埋め込むことが出来ます。
これをNode.jsで復号します。

手順

マスターキーの登録

IAM操作可能なユーザーでマスターキーを登録します。
IAM管理画面の暗号化キーから設定します。

暗号化キーの作成の前に、リージョンの選択してください。
暗号化キーはリージョンごと管理されています。

暗号化キーには識別子として、エイリアスを指定できます。
ここではチャットワークのAPI_KEYなのでchatbotとします。

暗号化キーには管理できるユーザと利用できるユーザを別々に指定することができます。
Lambdaで使う場合はLambdaの実行ユーザーは、キーユーザーとして登録するのが良いでしょう。

awsコマンドの設定

設定していなければ、awsコマンドの認証情報を設定します。

~ aws configure
AWS Access Key ID [****************DBSA]: YOUR_AWS_ACCESS_KEY_ID
AWS Secret Access Key [****************X5Ex]: YOUR_SECRET_ACCESS_KEY
Default region name [ap-northeast-1]:
Default output format [text]: json

AWS Access Key IDとAWS Secret Access KeyはIAM操作可能なユーザーで作成します。
Getting Set Up with the AWS Command Line Interface - AWS Command Line Interface

秘密情報(文字列)の暗号化

awsコマンドで文字列hello_worldを暗号化します。
マスターキーを登録した際のエイリアスを--key-id alias/chatbotのように指定します。

aws kms encrypt --key-id alias/chatbot --region ap-northeast-1 --plaintext hello_world
{
    "KeyId": "arn:aws:kms:ap-northeast-1:275624216953:key/c069b141-823a-4756-b973-dce51241b4b2",
    "CiphertextBlob": "AQECAHjf+WkQYtH+9sxLq9RViQWd+oHbIcUOdX1uNHBK2hEXhAAAAGkwZwYJKoZIhvcNAQcGoFowWAIBADBTBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDMI9ixmjyICcSa4+egIBEIAmojl8e63GFxuAUf7ZjzGQl0/R5Noe3E88GwIwYS++KnP5aE0NGHc="
}

CiphertextBlobの値が暗号化後の文字列です。

秘密情報の復号

ソースコード

CiphertextBlobの値をBASE64でデコードして、AWS.KMSのdecrypt関数に渡します。

index.js
const AWS = require('aws-sdk')

const CiphertextBlob = 'AQECAHjf+WkQYtH+9sxLq9RViQWd+oHbIcUOdX1uNHBK2hEXhAAAAGkwZwYJKoZIhvcNAQcGoFowWAIBADBTBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDMI9ixmjyICcSa4+egIBEIAmojl8e63GFxuAUf7ZjzGQl0/R5Noe3E88GwIwYS++KnP5aE0NGHc='

new AWS.KMS({
    region: 'ap-northeast-1'
  })
  .decrypt({
    CiphertextBlob: new Buffer(CiphertextBlob, 'base64')
  }, (err, data) => console.log(data.Plaintext.toString()))

実行

node .

結果

hello_world

補足

今はLambdaで環境変数が使えます。
API keyの保存には、環境変数を使う方がよいかもしれません。
【アップデート】AWS Lambdaで環境変数を使えるようになりました!!! | Developers.IO

参考

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?