暗号は「秘密を守る技術」、認証は「相手が本物か確かめる技術」。インターネット時代、両方が無いと安全な通信はできません。本記事は基本 3 要素 (共通鍵・公開鍵・ハッシュ) と HTTPS の中身を扱います。
1. 暗号の 3 大用途
- 機密性: 第三者に内容を見られない (盗聴対策)
- 完全性: 内容が改ざんされていない (ハッシュで検知)
- 認証: 相手が本人である (公開鍵で証明)
2. シーザー暗号 (古代の入門編)
アルファベットを N 文字ずらすだけ
Python
def caesar_encrypt(text, shift): result = "" for c in text: if c.isupper(): result += chr((ord(c) - 65 + shift) % 26 + 65) elif c.islower(): result += chr((ord(c) - 97 + shift) % 26 + 97) else: result += c return result
print(caesar_encrypt("HELLO", 3)) # 'KHOOR'print(caesar_encrypt("KHOOR", -3)) # 'HELLO' で復号
# 弱点: 26 通り全部試せばすぐ破られる3. 共通鍵暗号 (AES)
- AES (Advanced Encryption Standard): 現代の標準、128/192/256 ビット鍵
- 特徴: 高速、鍵が短くて済む、対称 (暗号化と復号が同じ鍵)
- 課題: 鍵をどうやって相手に共有するか (これが公開鍵暗号で解決)
- 用途: HTTPS の本通信、ファイル暗号化、Wi-Fi (WPA2/3)
4. 公開鍵暗号 (RSA / 楕円曲線)
- 鍵が 2 つ: 公開鍵 (世界に公開) + 秘密鍵 (本人のみ保持)
- 暗号化: 公開鍵で暗号化 → 秘密鍵で復号
- 署名: 秘密鍵で署名 → 公開鍵で検証
- RSA: 大きな素数の分解の困難さに依存、鍵長 2048-4096 ビット
- 楕円曲線 (ECC): より短い鍵で同等の強度、現代の主流
- 遅い: AES の 100-1000 倍遅い、なので「鍵交換」だけに使う
5. ハッシュ関数
Python のハッシュライブラリ
Python
import hashlib
# SHA-256 で文字列をハッシュ化text = "Hello, World!"h = hashlib.sha256(text.encode())print(h.hexdigest())# → dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f
# パスワード用には bcrypt or argon2 を使う (低速ハッシュ)# import bcrypt# hashed = bcrypt.hashpw(b"my_password", bcrypt.gensalt())6. HTTPS の中身 (TLS ハンドシェイク)
- 1Client Hello: ブラウザが「対応する暗号方式リスト」を送る
- 2Server Hello + 証明書: サーバが暗号方式を選択 + 公開鍵証明書を送る
- 3証明書検証: ブラウザが認証局 (CA) のチェーンを確認
- 4鍵交換: 公開鍵を使って共通鍵を安全に交換
- 5本通信: 共通鍵で AES 暗号化された HTTP 通信
7. パスワードの正しい保管
| やり方 | 評価 |
|---|---|
| 平文で保存 | ❌ 絶対 NG (DB 漏れた瞬間全員アウト) |
| MD5 ハッシュ | ❌ レインボーテーブル攻撃で破られる |
| SHA-256 ハッシュ | ❌ 速すぎて総当たり攻撃に弱い |
| SHA-256 + ソルト | △ ソルト追加で改善するが依然速い |
| bcrypt / argon2 | ✅ 推奨。意図的に低速で総当たりを困難に |
8. 次の話
EP.11 では データベースの基礎 に。SQL と関係モデル、インデックス、トランザクションを扱います。
この記事の感想を教えてください
あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。