鍵、ノンス、IVを安全に生成する
PythonとNodeでsecrets、os.urandom、安全なラッパーを使います。
「鍵、ノンス、IVを安全に生成する」はCoddyKit上の無料Cryptology Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCryptology Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cryptology Academyコースには全4レッスンが含まれています。
3 つのカテゴリ
安全に生成する必要がある暗号学的な値は、次の 3 種類に分けられます。(1) 鍵 — 長期間使用されるため、予測不能で秘密でなければなりません。(2) IV — メッセージごとに必要です。公開しても構いませんが、CBC では予測不能、GCM では一意でなければなりません。(3) ノンス — 使用するたびに一意でなければならず、ランダムである必要がある場合と、そうでない場合があります。
対称鍵
AES-128: secrets.token_bytes(16)。AES-256: secrets.token_bytes(32)。ChaCha20: secrets.token_bytes(32)。KDF(PBKDF2/Argon2)を使わずに、パスワードから鍵を導出しないでください。異なるアルゴリズムや用途の間で鍵を再利用しないでください。
非対称鍵の生成
from cryptography.hazmat.primitives.asymmetric import ec, rsa rsa_key = rsa.generate_private_key(public_exponent=65537, key_size=2048) ec_key = ec.generate_private_key(ec.SECP256R1()) # The library handles entropy sourcing internally
AES-CBC の IV
AES-CBC では、メッセージごとに一様分布のランダムな 16 バイト IV が必要です。同じ鍵で IV を再利用しないでください。CBC モードでカウンターを IV として使用しないでください。生成例: iv = os.urandom(16)。IV は秘密である必要はなく、予測不能であればよいため、暗号文の先頭に付加します。
AES-GCM のノンス
AES-GCM では、鍵とメッセージの各組み合わせに対して一意な 96 ビットノンスが必要です。ノンスを再利用すると GCM の安全性が致命的に損なわれ、攻撃者が認証鍵を復元してメッセージを偽造できるようになります。ランダムな 12 バイトノンス(2^32 メッセージで誕生日限界に達します)またはカウンターを使用してください。
カウンターベースのノンス
単一の鍵で大量の暗号化を行う場合は、鍵ごとに永続的なカウンターを維持します。nonce = counter.to_bytes(12, "big") とします。暗号化するたびにカウンターをインクリメントします。カウンターを永続ストレージに保存してください。再起動時にリセットすると、ノンスが再利用されます。
ノンス誤用耐性 AEAD
AES-GCM-SIV と Deoxys-II はノンス誤用耐性を持ちます。ノンスを再利用しても、安全性は決定論的暗号化と同程度まで低下するだけで、認証鍵が漏えいすることはありません。ノンスの一意性を保証しにくい場合(分散システムや、クラッシュ後に再起動する状況)に推奨されます。
鍵導出のための HKDF
複数の用途に同じ生の鍵素材を直接使用しないでください。用途ごとに鍵を導出します。from cryptography.hazmat.primitives.kdf.hkdf import HKDF。hkdf = HKDF(SHA256(), 32, salt, info=b"enc_key")。key = hkdf.derive(master_key)。用途ごとに異なる info を使用してください。
セッション鍵
共有秘密(ECDH の出力など)から HKDF を使って、セッション固有の鍵を導出します。TLS 1.3 は、ハンドシェイクとアプリケーションデータに対して、クライアントとサーバーそれぞれの鍵を導出します。セッション鍵によって侵害の影響が分離されるため、あるセッション鍵を知られても、他のセッションについては何も明らかになりません。
鍵ラッピング
鍵を安全に保存するには、AES-KW(RFC 3394)または AES-GCM を使い、鍵暗号化鍵(KEK)でラップします。ラップされた鍵は、データベースに保存したり送信したりできます。KEK は HSM またはハードウェアで保護されたキーストア(Android Keystore、Apple Secure Enclave)に保存します。
監査チェックリスト
デプロイ前に確認します。(1) すべての鍵が os.urandom/secrets から生成されている。(2) ハードコードされた鍵や IV がない。(3) 同じ鍵で IV を再利用していない。(4) GCM のノンスがメッセージごとに一意である。(5) 鍵のローテーションスケジュールが定義されている。(6) 鍵導出で、異なる info 文字列を指定した HKDF を使用している。
確認問題
AES-GCM でノンスを再利用すると、どのような結果になりますか。
まとめ
鍵には真のランダム性による生成が必要です。CBC の IV にはランダム性が、GCM のノンスには一意性が必要です。os.urandom/secrets を使用し、HKDF で鍵を導出し、KEK でラップしてください。ノンス誤用耐性を持つ AEAD は、誤った再利用から保護します。次は、ゼロ知識証明について学びます。
よくある質問
「鍵、ノンス、IVを安全に生成する」レッスンは無料ですか?
はい。「鍵、ノンス、IVを安全に生成する」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cryptology Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cryptology Academyコースには全4レッスンが含まれています。
「鍵、ノンス、IVを安全に生成する」で何を学びますか?
PythonとNodeでsecrets、os.urandom、安全なラッパーを使います。 ブラウザで直接実行するハンズオンコードでCryptology Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Cryptology Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCryptology Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「鍵、ノンス、IVを安全に生成する」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCryptology Academyレッスンでコードを書いて実行できますか?
はい。すべてのCryptology Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 真の乱数と擬似乱数
- 暗号学的に安全なPRNG
- エントロピー枯渇と脆弱な鍵のバグ
- 鍵、ノンス、IVを安全に生成する