ハードコードされた暗号化IV

暗号化で使う初期化ベクトルのハードコード

説明

CBC暗号化で同じ鍵と固定の初期化ベクトル(IV)を繰り返し使用すると、平文の先頭部分が共通していることが分かる場合があります。CBCでは、暗号化のたびに新しい予測困難なIVが必要です。他の暗号化モードでは、それぞれのnonce・IVの要件に従ってください。

想定される影響

  • 情報漏えい: 平文の繰り返しパターンから機密情報を推測される可能性があります。
  • データ改ざん: CBCだけでは完全性を保証できません。認証付き暗号または別途認証による保護が必要です。
  • パターン分析: IVの再利用により、暗号化されたメッセージ同士の関係が分かる場合があります。

対処方法

  • CBC暗号化のたびに、新しい予測困難なIVを使用します。
  • 実績のある暗号ライブラリを使って、IVを適切に管理します。

例

変更前

python
# IVをハードコードしたAES-CBC
import os
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad

key = os.environ["ENCRYTION_KEY"].encode()
cipher = AES.new(key, AES.MODE_CBC, b'This is an IV456') # ハードコードされたIV
plaintext = b'This is a secret message.'
ciphertext = cipher.encrypt(pad(plaintext, AES.block_size))

変更後

python
# 新しいランダムなIVを使うAES-CBC
import os
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
from Crypto.Random import get_random_bytes

key = os.environ["ENCRYTION_KEY"].encode()
iv = get_random_bytes(16)  # ランダムなIV
cipher = AES.new(key, AES.MODE_CBC, iv)
plaintext = b'This is a secret message.'
ciphertext = cipher.encrypt(pad(plaintext, AES.block_size))

解説:

  • 変更前: IVが固定されているため、暗号化されたデータ同士の関係を推測されやすくなります。
  • 変更後: 暗号化のたびに、新しいランダムなIVを生成します。

参考資料