메뉴 건너뛰기

app

깨진 방패를 들고 싸우지 마라: CWE-327 취약한 암호화 알고리즘 사용

suritam92026.01.17 21:35조회 수 0댓글 0

    • 글자 크기

1. 취약한 암호화 알고리즘 사용의 위험성

암호화의 목적은 데이터의 기밀성을 유지하는 것입니다. 그러나 기술의 발전과 컴퓨팅 성능의 향상으로 인해 과거에는 안전했던 알고리즘들이 더 이상 안전하지 않게 되었습니다. CWE-327은 이미 해독 방법이 알려졌거나, 무차별 대입 공격(Brute-force)에 취약해진 알고리즘을 사용하여 데이터를 보호할 때 발생합니다. 공격자는 이를 통해 암호화된 비밀번호를 복구하거나 민감한 통신 내용을 가로챌 수 있습니다.

2. 절대 사용해서는 안 될 위험 알고리즘 (Legacy)

현대적인 보안 기준에서 다음 알고리즘들은 사용을 지양해야 합니다.

해시(Hash): MD5, SHA-1 (충돌 공격에 취약하여 무결성 검증이나 비밀번호 저장에 부적합).

대칭키 암호화: DES, RC4 (키 길이가 너무 짧거나 알고리즘 구조적 결함이 발견됨).

비대칭키 암호화: 낮은 비트수의 RSA (1024비트 이하는 권장되지 않음).

3. 실무적 대응: 표준 알고리즘 채택과 키 관리

보안성을 담보하기 위해 검증된 표준 알고리즘을 사용해야 합니다.

대칭키 암호: AES-256 이상을 사용하며, 운영 모드는 ECB(전자 코드북) 대신 CBC나 GCM 모드를 권장합니다.

단방향 해시: 비밀번호 저장 시에는 SHA-256 이상의 알고리즘에 **솔트(Salt)**를 추가하거나, PBKDF2, Argon2와 같은 키 스트레칭 기술을 적용합니다.

비대칭키 암호: RSA는 최소 2048비트 이상을 사용합니다.

암호화 라이브러리: 검증된 표준 라이브러리(Java의 JCE 등)를 활용하고, 직접 암호화 알고리즘을 구현하지 않습니다(CWE-327의 또 다른 원인).

4. CWE-327 대응 및 안전한 암호화 구현 자바 코드 예시

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.GCMParameterSpec;
import java.util.Base64;
 
public class CryptoSecurityManager {
    private static final Logger logger = LoggerFactory.getLogger(CryptoSecurityManager.class);
    
    // [CWE-327 조치] 현대적 표준인 AES-GCM 방식 사용
    public String encryptData(String plainText, SecretKey key) {
        try {
            // [CWE-327 위험 예시] Cipher.getInstance("DES"); // 절대 금지
            
            // AES 알고리즘과 GCM 모드 사용 (Padding 없음)
            Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
            byte[] iv = new byte[12]; // GCM 권장 IV 길이
            new java.security.SecureRandom().nextBytes(iv);
            
            GCMParameterSpec spec = new GCMParameterSpec(128, iv);
            cipher.init(Cipher.ENCRYPT_MODE, key, spec);
            
            byte[] cipherText = cipher.doFinal(plainText.getBytes());
            
            // IV와 암호문을 결합하여 반환
            byte[] combined = new byte[iv.length + cipherText.length];
            System.arraycopy(iv, 0, combined, 0, iv.length);
            System.arraycopy(cipherText, 0, combined, iv.length, cipherText.length);
            
            logger.debug("Data successfully encrypted using AES-GCM.");
            return Base64.getEncoder().encodeToString(combined);
 
        } catch (Exception e) {
            // [CWE-754, CWE-390] 예외 처리
            logger.debug("Encryption error: {}", e.getMessage());
            return null;
        }
    }
}

코멘트: 암호화에서 가장 위험한 것은 "내가 직접 만든 알고리즘"과 "오래된 표준"입니다. 보안은 창과 방패의 싸움이며, 어제의 방패가 오늘의 종잇장이 될 수 있음을 명심해야 합니다. MD5나 DES와 같은 단어가 코드에 남아있다면 즉시 현대적인 AES나 SHA-256 이상으로 교체하십시오. logger.debug()를 통해 암호화 프로세스를 기록하되, 암호화 키나 초기화 벡터(IV)와 같은 민감 정보가 로그에 남지 않도록 주의하는 것이 시큐어 코딩의 마무리입니다.

 
    • 글자 크기
평문으로 방치된 데이터의 위협: CWE-312 중요 정보 미암호화 저장 (by suritam9) 열려있는 비밀의 문: CWE-732 중요한 자원에 대한 잘못된 권한 설정 (by suritam9)

댓글 달기

첨부 (0)
위로