暗号化

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

セキュリティ
「暗号化」の技術書を見る →

暗号化とは

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

対称鍵 vs 非対称鍵

暗号化方式は鍵の持ち方で対称鍵と非対称鍵に分かれる。実務では両者を組み合わせ、データ本体は対称鍵で暗号化し、その鍵の受け渡しや合意 (鍵交換) に非対称鍵を使う。

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

TLS での組み合わせ

TLS は接続の確立時に非対称鍵で鍵交換を行い、以降のデータ転送は対称鍵で処理する。

1. 非対称鍵で鍵交換 (TLS 1.3 は ECDHE/DHE のみ・TLS 1.2 では RSA 鍵輸送も可)
2. 共有された対称鍵でデータを暗号化 (AES-256-GCM)
→ 非対称鍵の安全性 + 対称鍵の速度を両立

鍵交換に使う鍵と署名に使う鍵は役割が別である。ECDSA は署名専用で鍵交換には使えず、楕円曲線で鍵交換を行うのは ECDH (TLS では一時鍵を使う ECDHE) である。TLS 1.3 (RFC 8446) では静的 RSA と静的 Diffie-Hellman の暗号スイートが削除され、鍵交換は前方秘匿性のある (EC)DHE のみになった。そのため TLS 1.2 時代の「RSA で鍵を送る」図は 1.3 では成り立たない。

AWS での暗号化

保存時の暗号化 (At Rest)

S3 は 2023 年 1 月 5 日以降、新規オブジェクトを既定で SSE-S3 (S3 マネージドキー) により暗号化する。鍵の管理を自分で握りたい場合は SSE-KMS / DSSE-KMS / SSE-C を選ぶ。DynamoDB は保存時の暗号化を無効化できず、鍵は AWS 所有キー (既定 / 追加料金なし) / AWS マネージドキー / カスタマー管理キーの 3 種から選ぶ。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 が KMS キー (旧称 CMK) でデータキーを復号
3. 復号されたデータキーでデータを復号

ハッシュ (一方向)

暗号化と異なり、ハッシュは復号できない。パスワードの保存には bcrypt、データの整合性検証には SHA-256、メッセージ認証には HMAC を使用する。SHA-256 は高速に計算できるため、パスワードの保存には向かない。パスワードには計算コストを調整できるアルゴリズムを選ぶ。

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

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

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

共有:

この記事は役に立ちましたか?

関連用語

関連する記事