소프트웨어 개발보안 가이드 분석(2021) : 취약한 암호화 알고리즘 사용

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

"취약한 암호화 알고리즘 사용"은 시스템이나 소프트웨어에서 암호화에 사용되는 알고리즘이 취약하거나 안전하지 않은 알고리즘을 사용함으로써 발생하는 보안 취약점입니다. 이러한 보안 취약점은 공격자가 암호화된 데이터를 해독하여 데이터의 기밀성을 위협하게 됩니다.

 

취약한 암호화 알고리즘 사용으로 인한 영향

취약한 암호화 알고리즘 사용 시 보안에 심각한 위협이 될 수 있습니다. 예를 들어, 취약한 암호화 알고리즘의 경우 모든 키 조합을 시도하여 암호를 해독하는 방법인 브루트 포스 공격(brute force attack)에 취약할 수 있습니다. 실제로 취약한 암호화 알고리즘으로 인한 보안 사고는 전 세계적으로 여러차례 발생했으며, 이로 인해 많은 정보가 위험에 노출되었습니다. 실제로 사용자의 비밀번호를 취약한 암호화 알고리즘을 사용하여 저장한 웹 사이트가 해킹당하고 수백만 명의 사용자 정보가 유출된 사례가 있습니다.

OO사이트 개인정보 유출 사례

OO 사이트에서 사용자의 비밀번호를 보호하기 위해 MD5 해시 함수를 사용하고 있었으며 MD5는 메시지 다이제스트 알고리즘 5를 의미합니다. 원래는 파일이나 메시지의 무결성을 검증하는 데 사용되는 해시 함수입니다. 그러나 MD5는 시간이 지나면서 여러 가지 취약점이 발견되었고, 해시 충돌 공격에 취약한 것으로 알려져 있습니다. 해시 충돌이란 서로 다른 두 입력값이 동일한 해시 값을 생성하는 상황을 말합니다. 이러한 취약점 때문에 공격자는 무차별 대입 공격(brute force attack)이나 사전 공격(dictionary attack), 레인보우 테이블(Rainbow Table) 등을 통해 사용자의 원래 비밀번호를 추측할 수 있게 됩니다. OO 사이트 개인정보 해킹 사건에서는 공격자가 MD5 해시 함수의 취약성을 이용하여 사용자의 비밀번호를 복구하였던 것으로 추정됩니다. 레인보우 테이블로 평문을 역추적하는 것을 방지하기 위해 해시 과정에서 비밀번호에 임의의 문자열을 추가하여 해시 값을 더욱 예측하기 어렵게 만드는 방법 salt라는 추가적인 보안 조치가 없이 단순한 MD5 해시만 사용하는 경우 공격자가 비밀번호를 복구하는 것이 쉽게 이루어질 수 있습니다.

취약한 웹 어플리케이션의 예

다음은 코드는 웹 애플리케이션에서 MD5 해시를 사용하여 사용자의 비밀번호를 저장하는 경우의 예시입니다.

import java.security.MessageDigest;

public class WeakEncryption {

    public static String encryptPassword(String password) {
        // MD5를 사용한 암호화 (취약)
        MessageDigest md;
        try {
            md = MessageDigest.getInstance("MD5");
            md.update(password.getBytes());
            byte[] digest = md.digest();
            return new String(digest);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

위의 코드에서 비밀번호를 저장할 때 보안에 취약하다고 알려져 있는 MD5 해시 알고리즘을 사용하여 사용자의 비밀번호를 저장하고 있습니다. 이러한 코드의 경우 앞서 이야기한 개인정보 유출 사건과 같이 보안 사고가 발생할 수 있습니다.

 

시큐어 코딩 적용 방법

취약한 암호화 알고리즘 사용으로 인하여 발생할 수 있는 보안 사고를 방지하기 위한 보안 대책은 다음과 같습니다.

  1. 안전한 암호화 알고리즘 사용: MD5, SHA-1과 같이 취약한 암호화 알고리즘 대신 안전하다고 알려진 SHA-256, SHA-3 등의 해시 함수를 사용합니다.
  2. Salt와 Key Stretching 사용: Salt는 각 비밀번호 해싱 과정에 임의의 데이터를 추가하는데, 같은 비밀번호라도 서로 다른 솔트 값을 적용하면 서로 다른 해시 값을 가지게 만듭니다. Key Stretching 기법은 해시 계산을 여러 번 반복하여 해싱 과정에 소요되는 시간을 길게 하여, 공격자가 브루트 포스 공격 시 공격 시간을 지연시키는 기술입니다.

다음 코드는 SHA-256 해쉬 함수를 사용하여 비밀번호를 암호화하는 코드 예시입니다.

import java.security.MessageDigest;
import javax.xml.bind.DatatypeConverter;

public class StrongEncryption {

    public static String encryptPassword(String password) {
        // SHA-256을 사용한 암호화
        MessageDigest md;
        try {
            md = MessageDigest.getInstance("SHA-256");
            md.update(password.getBytes());
            byte[] digest = md.digest();
            return DatatypeConverter.printHexBinary(digest).toUpperCase();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

안전한 웹 애플리케이션 개발을 위해서는 보안 취약점을 고려하여 중요 정보 및 민감정보 암호화 시 안전한 암호화 알고리즘을 이용하여 암호화하고, 적절한 키 관리 및 업데이트 정책을 수립해야 합니다.

  • 이전 소프트웨어 개발보안 가이드 분석(2021) : 중요한 자원에 대한 잘못된 권한 설정
  • 다음 소프트웨어 개발보안 가이드 분석(2021) : 암호화되지 않은 중요정보