설명
알려진 약점이 있는 암호화 알고리즘이나 부적절한 운용 모드를 사용하면 데이터의 기밀성 또는 무결성을 보호하지 못할 수 있습니다. 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, 암호문은 함께 보관하거나 전달하되, 키는 별도로 보호하세요. 검증 실패 시 복호화 결과를 사용하면 안 됩니다.