암호 블록 체인(CBC) 모드로 데이터를 암호화할 때 초기화 벡터(IV)를 사용하여 암호화를 무작위로 생성합니다. 즉, 주어진 키 아래에서 동일한 평문이 항상 동일한 암호문을 생성하지는 않습니다. IV는 비밀일 필요는 없지만 ‘선택된 일반 텍스트 공격’을 피하기 위해 예측할 수 없어야 합니다.
초기화 벡터를 생성하려면 안전한 난수 생성기를 사용할 것을 NIST는 권장합니다.
규칙을 어긴 코드
PyCryptodome 모듈의 경우
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad, unpad
static_vector = b'x' * AES.block_size
cipher = AES.new(key, AES.MODE_CBC, static_vector)
cipher.encrypt(pad(data, AES.block_size)) # 규칙을 어긴 코드
cryptography 모듈의 경우
from os import urandom
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
static_vector = b'x' * 16
cipher = Cipher(algorithms.AES(key), modes.CBC(static_vector))
cipher.encryptor() # 규칙을 어긴 코드
규칙을 준수한 해결책
PyCryptodome 모듈의 경우
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad, unpad
random_vector = get_random_bytes(AES.block_size)
cipher = AES.new(key, AES.MODE_CBC, random_vector)
cipher.encrypt(pad(data, AES.block_size))
cryptography 모듈의 경우
from os import urandom
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
random_vector = urandom(16)
cipher = Cipher(algorithms.AES(key), modes.CBC(random_vector))
cipher.encryptor()
같이보면 좋은 자료드
- OWASP Top 10 2021 Category A2 - 암호화 실패
- OWASP Top 10 2017 Category A3 - 민감한 데이터 노출
- OWASP Top 10 2017 Category A6 - 보안 구성 오류
- Mobile AppSec Verification Standard - 암호화 요구 사항
- OWASP Mobile Top 10 2016 Category M5 - 암호화 불충분
- MITRE, CWE-329 - CBC 모드에서 예측할 수 없는 IV를 사용하지 않음
-
NIST, SP-800-38A - 블록 사이퍼 작동 모드에 대한 권장 사항
If you like SONARKUBE, don’t forget to give me a star.