脆弱な暗号方式の使用

脆弱な暗号方式を見直し、鍵管理と完全性検証を備えた暗号化を使用してください。

説明

既知の弱点を持つアルゴリズムや不適切なモードでは、データの機密性や完全性を保護できない場合があります。DESの短い鍵や、ECBでデータのパターンが表れることが代表例です。アルゴリズム名だけでなく、モード、鍵の管理、改ざん検証も確認してください。

想定される影響

  • 暗号文を入手した攻撃者が弱い暗号を解読し、機密情報にアクセスする可能性があります。
  • 完全性を検証しないと、変更された暗号文を処理するおそれがあります。
  • 認証情報が漏えいすると、アカウントやサービスへの不正アクセスにつながる可能性があります。

対処方法

  • データの暗号化には、検証されたライブラリのAES-GCMなどの認証付き暗号を使ってください。
  • 鍵を安全に生成・保管し、同じ鍵でnonceを再利用しないでください。復号時に認証タグを検証してください。
  • 既存の暗号文の形式と鍵を確認して移行を計画し、適用できるOWASPやNISTの指針に従ってください。

例

PyCryptodomeを使う例です。メモリ内で新しい鍵を作る部分は説明用であり、実際のシステムでは鍵を保護されたストアで管理する必要があります。

変更前

python
# Unsafe DES encryption
from Crypto.Cipher import DES
from Crypto.Util.Padding import pad

key = b'8bytekey'  # 56비트 DES 키
cipher = DES.new(key, DES.MODE_ECB)
plaintext = b'This is a secret message.'
ciphertext = cipher.encrypt(pad(plaintext, DES.block_size))

変更後

python
# Authenticated AES encryption
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes

key = get_random_bytes(32)  # 256비트 AES 키
cipher = AES.new(key, AES.MODE_GCM)
plaintext = b'This is a secret message.'
ciphertext, tag = cipher.encrypt_and_digest(plaintext)
nonce = cipher.nonce

receiver = AES.new(key, AES.MODE_GCM, nonce=nonce)
recovered = receiver.decrypt_and_verify(ciphertext, tag)

解説

  • 変更前: パディングはブロック長を合わせるだけです。DESの56ビット鍵とECBの弱点は残ります。
  • 変更後: AES-GCMで暗号化し、復号時にタグを検証します。nonce、tag、暗号文は一緒に保管・送信できますが、鍵は別途保護してください。検証に失敗した場合は復号結果を使用しないでください。

参考資料