暗号化

データを第三者が読めない形式に変換し、機密性を保護する技術

セキュリティ

暗号化とは

暗号化 (Encryption) は、平文 (Plaintext) を暗号文 (Ciphertext) に変換し、鍵を持つ者だけが復号できるようにする技術である。保存時の暗号化 (Encryption at Rest) と転送時の暗号化 (Encryption in Transit) がある。

対称鍵 vs 非対称鍵

方式 速度 用途
対称鍵 (AES) 暗号化と復号に同じ鍵 高速 データの暗号化
非対称鍵 (RSA, ECDSA) 公開鍵と秘密鍵のペア 低速 鍵交換、デジタル署名

TLS での組み合わせ

1. 非対称鍵で鍵交換 (RSA/ECDHE)
2. 共有された対称鍵でデータを暗号化 (AES-256-GCM)
→ 非対称鍵の安全性 + 対称鍵の速度を両立

AWS での暗号化

保存時の暗号化 (At Rest)

S3 は SSE-S3 または SSE-KMS、DynamoDB は AWS マネージドキーまたは CMK、EBS は AES-256、RDS は AES-256 (KMS) で暗号化する。

転送時の暗号化 (In Transit)

ブラウザから CloudFront は TLS 1.2/1.3、CloudFront から ALB は TLS、Lambda から DynamoDB は TLS (自動) で暗号化される。

エンベロープ暗号化

1. KMS がデータキー (平文 + 暗号化済み) を生成
2. 平文のデータキーでデータを暗号化
3. 平文のデータキーを破棄
4. 暗号化済みデータキー + 暗号化データを保存

復号:
1. 暗号化済みデータキーを KMS に送信
2. KMS がマスターキーでデータキーを復号
3. 復号されたデータキーでデータを復号

ハッシュ (一方向)

暗号化と異なり、ハッシュは復号できない。パスワードの保存には bcrypt、データの整合性検証には SHA-256、メッセージ認証には HMAC を使用する。

// ❌ パスワードを平文で保存
await db.put({ password: 'secret123' });

// ✅ bcrypt でハッシュ化して保存
import bcrypt from 'bcrypt';
const hash = await bcrypt.hash('secret123', 10);
await db.put({ passwordHash: hash });

実務での活用方法は関連書籍にも詳しい。

関連用語