暗号化
データを第三者が読めない形式に変換し、機密性を保護する技術
セキュリティ
暗号化とは
暗号化 (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 });
実務での活用方法は関連書籍にも詳しい。