説明
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を生成します。
参考資料
- OWASP: 暗号化によるデータ保護
- CWE: CWE-329: CBCでランダムなIVを使用しない