Python暗号でよくある落とし穴と安全なパターン
ハードコードされた鍵、ECBモード、constant-timeでない比較などを避けます。
「Python暗号でよくある落とし穴と安全なパターン」はCoddyKit上の無料Cryptology Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCryptology Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cryptology Academyコースには全4レッスンが含まれています。
最も危険な暗号の間違い
暗号は、誤った使い方をしやすい技術です。Pythonでよくある落とし穴には、ハードコードされた鍵、ECBモード、定数時間でない比較、弱い乱数、鍵やノンスの再利用、独自暗号の実装があります。
落とし穴1:ハードコードされた鍵
鍵をソースコードに埋め込んではいけません。鍵はgitの履歴、ログ、エラーメッセージに残ってしまいます。環境変数またはKMSを使用してください。
# WRONG
SECRET_KEY = b"my_secret_key_12" # visible in git!
# RIGHT
import os
SECRET_KEY = os.environb.get(b"SECRET_KEY") or os.urandom(32)
# Or load from KMS at startup落とし穴2:ECBモード
AES-ECBは各ブロックを独立して暗号化するため、同一の平文ブロックからは同一の暗号文ブロックが生成されます。「ECBペンギン」攻撃により、画像や構造化データのパターンが明らかになります。必ずGCM、またはランダムなIVを使ったCBCを使用してください。
# WRONG — never use ECB
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
cipher = Cipher(algorithms.AES(key), modes.ECB()) # insecure!
# RIGHT
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
aesgcm = AESGCM(key) # authenticated encryption落とし穴3:定数時間でないMAC比較
MACの比較に==を使用すると、タイミング情報が漏えいします。必ずhmac.compare_digestを使用してください。
import hmac
# WRONG — leaks timing
if received_mac == expected_mac:
pass
# RIGHT — constant-time
if hmac.compare_digest(received_mac, expected_mac):
pass落とし穴4:弱い乱数生成
暗号用途にrandomモジュールを使用してはいけません。これはCSPRNGではありません。secretsまたはos.urandomを使用してください。
import random, secrets, os
# WRONG
key = bytes([random.randint(0, 255) for _ in range(32)]) # predictable!
# RIGHT
key = os.urandom(32) # OS CSPRNG
token = secrets.token_bytes(32) # secrets module wrapper落とし穴5:IV/ノンスの再利用
CBCでIVを、GCMでノンスを再利用すると、安全性が損なわれます。暗号化ごとに新しいランダムなIVまたはノンスを生成し、暗号文と一緒に保存してください。
import os
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
key = AESGCM.generate_key(bit_length=256)
aesgcm = AESGCM(key)
# WRONG — fixed nonce
nonce = b"\x00" * 12 # reuse breaks GCM!
# RIGHT — fresh nonce every time
nonce = os.urandom(12)
ciphertext = aesgcm.encrypt(nonce, b"data", None)落とし穴6:セキュリティ目的でのMD5またはSHA-1の使用
MD5とSHA-1は、衝突耐性の面で暗号学的に破られています。デジタル署名、証明書フィンガープリント、HMACには決して使用しないでください。SHA-256またはSHA-3-256を使用してください。
落とし穴7:独自暗号の実装
暗号プリミティブをゼロから実装すると、ほぼ必ず微妙なバグが入り込みます。cryptography、PyNaCl、またはPyCAパッケージを使用してください。AES、RSA、ECDSAを自分で実装してはいけません。
安全なパターン:高レベル暗号化にPyNaClを使用する
PyNaClはNaCl/libsodiumライブラリをラップした、誤用しにくい設計のAPIを提供します。
# pip install PyNaCl
import nacl.secret
import nacl.utils
key = nacl.utils.random(nacl.secret.SecretBox.KEY_SIZE)
box = nacl.secret.SecretBox(key)
encrypted = box.encrypt(b"my secret message")
decrypted = box.decrypt(encrypted)
print("Decrypted:", decrypted) # Uses XSalsa20-Poly1305安全なパターン:Argon2によるパスワードハッシュ化
パスワードのハッシュ化にはargon2-cffiを使用してください。SHA-256やbcryptを直接使用してはいけません。
# pip install argon2-cffi
from argon2 import PasswordHasher
ph = PasswordHasher(time_cost=3, memory_cost=65536, parallelism=4)
hash_val = ph.hash("user_password")
print("Hash:", hash_val[:40], "...")
# Verify
try:
ph.verify(hash_val, "user_password")
print("Password correct")
except Exception:
print("Wrong password")鍵のゼロ化
メモリ上で鍵を使用した後は、メモリダンプ攻撃にさらされる時間を短くするため、鍵をゼロ化してください。PythonのGCではこれが難しいため、ctypesを使用するか、これを自動的に処理するPyNaClを使用してください。
理解度チェック
暗号学的なMACを比較するとき、==の代わりにどのPython関数を使用する必要がありますか?
学習内容のまとめ
ハードコードされた鍵、ECBモード、MAC比較での==、randomモジュール、ノンスの再利用を避けてください。乱数にはos.urandomまたはsecretsを、暗号化にはAESGCMを、検証にはhmac.compare_digestを使用してください。PyNaClとargon2-cffiは、対称暗号とパスワード向けに安全な高レベルAPIを提供します。
よくある質問
「Python暗号でよくある落とし穴と安全なパターン」レッスンは無料ですか?
はい。「Python暗号でよくある落とし穴と安全なパターン」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cryptology Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cryptology Academyコースには全4レッスンが含まれています。
「Python暗号でよくある落とし穴と安全なパターン」で何を学びますか?
ハードコードされた鍵、ECBモード、constant-timeでない比較などを避けます。 ブラウザで直接実行するハンズオンコードでCryptology Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Cryptology Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCryptology Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「Python暗号でよくある落とし穴と安全なパターン」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCryptology Academyレッスンでコードを書いて実行できますか?
はい。すべてのCryptology Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Python cryptographyライブラリの概要
- PythonでAES-GCMを暗号化・復号化する
- PythonでRSAとECDSAの鍵ペアを扱う
- Python暗号でよくある落とし穴と安全なパターン