暗号化
Cryptography
データを守る暗号の基礎。守る場所(転送時/保存時)、鍵の方式(対称/非対称)、パスワード保存(ハッシュ+ソルト+bcrypt/Argon2)、通信路の保護(TLS)を押さえる。『パスワードを暗号化』は減点表現で、正しくは『ハッシュ化』。
守る『場所』の話: 転送時 と 保存時
データを守ると言っても、守る場所は2つあります。両方やって初めて安全で、片方だけでは穴が残ります。
- 転送時(in transit): ネットワークを移動中のデータ。郵便でいう『配達中の手紙』。盗み見・すり替えを防ぐため TLS(旧称SSL)で暗号化します。
HTTPSとは要するに『TLSで包んだHTTP』のこと。 - 保存時(at rest): ディスクやDBに置いてあるデータ。郵便でいう『金庫にしまった手紙』。盗難やバックアップ流出に備えて、ディスク暗号化・カラム暗号化・KMS(鍵管理サービス)で守ります。
primerの『encrypt in transit and at rest』はこの両方を指します。移動中だけ守ってもDBが盗まれたら終わり、逆もまた然り。
鍵の『方式』の話: 対称 vs 非対称
| 種類 | 鍵の使い方 | 速度 | 用途 | 例 |
|---|---|---|---|---|
| 対称暗号 | 暗号化と復号で同じ鍵 | 速い ◎ | 大量データの暗号化 | AES(特にAES-GCM) |
| 非対称暗号(公開鍵) | 公開鍵で暗号化・秘密鍵で復号(署名は逆向き) | 遅い △ | 鍵交換、署名、認証 | RSA, ECC |
たとえ話:
- 対称暗号 = 同じ鍵で開け閉めする南京錠。速くて便利だが、『その鍵を相手にどう渡すか』が問題(鍵を盗まれたら終わり)。
- 非対称暗号 = 誰でも閉められるが、持ち主しか開けられない郵便ポスト。公開鍵(投入口)は世界に公開してよく、秘密鍵(取り出す鍵)は本人だけが持つ。これなら鍵を事前に共有しなくても安全に届けられる。
TLSはハイブリッド(両方の良いとこ取り)
ここが綺麗な設計です。非対称暗号は安全だが遅い、対称暗号は速いが鍵共有が課題。そこでTLSは:
図を描画中...
最初だけ遅い非対称で安全に対称鍵を渡し、本番は速い対称暗号で通信する——これでセキュリティと速度を両立しています。
パスワード保存: ここが最頻出
面接で『パスワードをどう保存する?』と聞かれて『暗号化して保存』と答えると減点です。正しくはハッシュ化。違いを押さえましょう。
- 暗号化 = 鍵があれば元に戻せる(可逆)。
- ハッシュ = 元に戻せない(一方向)。
パスワードは照合(入力値をハッシュして保存値と比べる)できればよく、元に戻す必要がないので、わざと戻せないハッシュを使います。万一DBが漏れても生パスワードは復元できません。
ソルト・ペッパー・専用ハッシュ
図を描画中...
- ソルト(salt): ユーザーごとに付けるランダム値。これがあると、同じパスワードでも保存されるハッシュが人によって変わるので、あらかじめ計算した辞書(レインボーテーブル)が効かなくなります。
- ペッパー(pepper): 全ユーザー共通の秘密値をDBの外(コードやKMS)に持つ追加防御。DBだけ漏れても破られにくくなる。
- 専用ハッシュ: SHA-256を1回かけるだけでは速すぎて、攻撃者がGPUで毎秒数十億回試せてしまう。そこで
bcrypt/scrypt/Argon2/PBKDF2というわざと遅いアルゴリズムを使い、総当たりを非現実的にします。現行の推奨は Argon2id。
つまずきポイント
- 『なぜSHA-256一回ではダメ?』→ 速すぎるから。ハッシュは普通『速い方が良い』ですが、パスワード保存に限っては遅い方が良い(攻撃者の総当たりが遅くなる)という逆転の発想がポイント。
- ソルトの目的を一文で: 『同一パスワードのハッシュを別々にして、事前計算の辞書攻撃を無効化する』。
- JWTやmTLSの裏側もこの暗号技術。署名(改ざん検知)は非対称暗号、TLSはハイブリッド——と繋げて理解すると一気に見通しが良くなります。