👌

Lambdaを使用して暗号化し、Google Apps Script(GAS)上で復号化する方法

2024/02/22に公開

LambdaレイヤーにCryptoJSライブラリを追加する

CryptoJSライブラリは Lambda に含まれていないため、自分でレイヤーを作成する必要があります。
https://github.com/brix/crypto-js
https://qiita.com/aiiro_engineer/items/2f96692073004f796c3c

LambdaレイヤーでNode.jsの依存関係を使用する際には、特定のディレクトリ構造が要求されます。
その構造は以下のようになります:

nodejs/
└── node_modules/
    └── [パッケージ名]/

Lambdaレイヤー用のlambda_layerディレクトリを作成し、その中にnodejsディレクトリを作成し、さらにその中にnode_modulesディレクトリを作成します。

mkdir -p lambda_layer/nodejs/node_modules

lambda_layerディレクトリに移動します。

cd lambda_layer/nodejs

Lambdaレイヤー用のパッケージをインストールするために、ダミーのpackage.jsonファイルを作成します。

echo '{}' > package.json

CryptoJSライブラリをインストールします。

npm install crypto-js

Lambdaレイヤーに不要なファイルを削除します。

rm package.json package-lock.json

圧縮するために現在のディレクトリから一つ上の階層に移動します。

cd ..

crypto-jsディレクトリをzipアーカイブに圧縮します。

zip -r crypto-js.zip nodejs

作成したzipファイルをレイヤーにアップロードしてレイヤーを作成してください。

Lambda関数

先ほど作成したレイヤーを追加してコード内容は下記とします。

index.mjs
import CryptoJS from 'crypto-js';

export const handler = async () => {
const key = 'key'; // 暗号化に使用する鍵
const date = '暗号化する文字列';

// 暗号化
const  encryptedString = CryptoJS.AES.encrypt(date,key).toString();

// リターンして内容を確認する記述例
   return ContentService.createTextOutput(
     JSON.stringify({
       result: 'success',
       encryptedString : encryptedString ,
     })
   ).setMimeType(ContentService.MimeType.JSON);

GASにライブラリを追加する

CryptoJSを使用してデータの暗号化と復号化を行うことができるCryptoJS libraries for Google Apps Scriptライブラリを追加します。
https://ramblings.mcpher.com/gassnippets2/cryptojs-libraries-for-google-apps-script/

その他GASで追加できるライブラリ一覧
https://officeforest.org/wp/2018/04/08/google-apps-scriptはライブラリを活用すべし/

コンソール画面の左メニューからライブラリを選択

1IEkpeS8hsMSVLRdCMprij996zG6ek9UvGwcCJao_hlDMlgbWWvJpONrsを入力し、
検索を押してください。

ライブラリの内容が表示されたら追加を選択

cCryptoGSというライブラリが追加されているのがわかると思います。

GAS上での記述

POSTリクエストしてください。

ライブラリの使い方は下記を参考にさせていただきました。
https://www.kamo-it.org/blog/gas-aes/

index.gs
const doPost = (e: GoogleAppsScript.Events.DoPost) => {
const payload = JSON.parse(e.postData.contents);
const data = payload.data;

const secretKey = 'key';
const cipher = new cCryptoGS.Cipher(secretKey, 'aes');
// 暗号化されたデータの復号
const decryptedData = cipher.decrypt(data);
console.log('decryptedData',decryptedData)
}

asideを使用してデプロイした場合

ライブラリを追加後に再度デプロイした場合は、ライブラリが消えてしまいます。

解決策としては、もう一度上記の手順でライブラリを追加しても良いのですが、デプロイするたびに追加するのは手間がかかるので、下記の記事を参考にappsscript.jsonを編集してください。
https://zenn.dev/nenenemo/articles/2b1d78caf8746a

PythonでAESを使用して暗号化する場合

以下のみ記述しておきます。
cryptographyライブラリを使用するため、レイヤーを追加してください。

cryptography
https://pypi.org/project/cryptography/
arn:aws:lambda:ap-northeast-1:770693421928:layer:Klayers-p39-cryptography:19
https://github.com/keithrozario/Klayers/tree/master/deployments/python3.9

ローカル環境で開発する場合

asideなどでローカル環境で開発する場合、cCryptoGSCannot find name 'cCryptoGS'. Did you mean 'CryptoJS'?ts(2552)というエラーが出てしまうと思います。

TypeScriptの型定義ファイルを作成してください。

cCryptoGS.d.ts
// declare namespace cCryptoGS {
namespace cCryptoGS {
  class Cipher {
    constructor(secretKey: string, algorithm: string);
    // decrypt メソッドの型定義を追加
    // decrypt(encryptedText: string): string;
  }
}

ウェブアプリでデプロイする際にURLを変えない

新しいデプロイを選択してしまうとURLが変更されてしまうので、デプロイ管理を選択

右上の鉛筆アイコンを選択、新バージョンを選択し、右下のデプロイを押すと、URLが変更されず新しくデプロイができます。

古いバージョンは削除しないと溜まっていくので、左側のメニューのプロジェクト履歴を選択すると右にプロジェクト一覧が表示されるので、不要なバージョンを削除してください。

終わりに

何かありましたらお気軽にコメント等いただけると助かります。
ここまでお読みいただきありがとうございます🎉

Discussion