취약한 암호화 알고리즘 사용

취약한 암호화 방식을 검토하고 키 관리와 무결성 검증을 갖춘 암호화를 사용하세요.

설명

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

참조