Node.js・Express・TypeScriptを使い、自前で暗号化処理を作成したので備忘録として書きます。この記事では、AES256-GCMという強固な暗号化アルゴリズムを利用して、データを安全に暗号化する方法を解説します。
はじめに
この記事では、Node.js、Express、およびTypeScriptを使用して、AES256-GCM暗号化アルゴリズムを使ってデータを暗号化するプロセスを書いています。AES256-GCMは共通鍵暗号化方式の一部で、安全なデータ保護を目的として広く使用されています。
AES256-GCMとは
暗号化方式には主に以下の2種類が存在します。
- 共通鍵暗号化
- 公開鍵暗号化
AES256は共通鍵暗号化方式の一つで、特にセキュリティが強化されています。AES256には、ECBモードとGCMモードの2種類があり、GCMモードは認証付き暗号化を提供し、データの機密性と完全性の両方を保護するため、より堅牢です。
bcryptとの違い
bcryptは、主にパスワードのハッシュ化に使用される一方向性関数です。ハッシュ化されたデータは元に戻すことが非常に困難です。これは、ソルトと呼ばれるランダムな文字列を平文に付与し、ストレッチング(ハッシュ値への変換を数千〜数万回行うこと)を行うためです。
AES256-GCMは二方向性の暗号化方式であり、適切なキーを持っていれば暗号化されたデータを復号化することができます。
AES256-GCMで必要なもの
AES256-GCMを使用する際には、以下の要素が必要です。
- 平文: 暗号化する対象のデータ
- Key: 暗号化および復号化の際に使用する秘密鍵
- IV: 初期化ベクトル。暗号文のパターンを予測困難にするためのランダムなデータ
TypeScriptでの実装
以下にTypeScriptで実装したコードを示します。この例では、暗号化プロセスを関数として定義しています。
なお、実際に使用した内容からは改変しております。
const crypto = require('crypto');
export const encrypt = async (original: string): Promise<string> => {
const cipher = crypto.createCipheriv(
// AES-256-GCM暗号化アルゴリズムを使用します。
"aes-256-gcm",
// 256ビット(32バイト)の暗号化キーを指定します。
// 実際の開発では、このキーは秘密にしておく必要があります。
// 環境変数などを利用して外部から読み込むのが一般的です。
Buffer.from("6927bb1e3619a9db79432f99b8cb237a8d70c5272b6e72d0321d40f8e3c35e18", 'hex'),
// 初期化ベクトル(IV)を指定します。
// IVは暗号化の過程で使われ、暗号文のパターンをより予測困難にします。
// これも秘密にする必要があり、実際の開発では外部から読み込むのが一般的です。
Buffer.from("55d7b7025ba6e8a5a5aa5b5c", 'hex')
);
// 平文をUTF-8エンコーディングで暗号化し、cipher.final()を呼び出して暗号化プロセスを完了させ、結果の暗号化されたデータをバッファとして取得します。
const encrypted = Buffer.concat([
cipher.update(original, 'utf8'),
cipher.final(),
]);
// 暗号化されたデータをBase64エンコーディングして文字列として返します。
return encrypted.toString('base64');
};
この関数は平文、暗号化キー、および初期化ベクトルを引数として受け取り、暗号化されたデータをBase64エンコーディングの文字列として返します。
注意点として、暗号化キーと初期化ベクトルは安全に管理する必要があります。これらは外部の設定ファイルや環境変数から取得するのが一般的です。
まとめ
この記事では、Node.js, Express, TypeScriptを用いてAES256-GCM暗号化アルゴリズムでデータを暗号化する方法を解説しました。AES256-GCMは強固な暗号化を提供し、データの機密性を保護します。暗号化キーと初期化ベクトルは慎重に管理し、.envなどで保管することが重要です。