소프트웨어 개발보안 가이드 분석(2021) : 충분하지 않은 키 길이 사용
충분하지 않은 키 길이 사용이란?
충분하지 않은 키 길이 사용이란 암호화나 해시 함수에서 사용되는 키의 길이가 충분하지 않아 보안성이 떨어지는 취약점을 말합니다. 키의 길이가 충분하지 않으면, 브루트 포스 공격 등을 통해 짧은 시간 안에 키를 찾아내 암호화된 데이터나 패스워드를 복호화 할 수 있는 취약점을 말합니다.
공격 메커니즘
충분하지 않은 키 길이 사용 시 발생할 수 있는 공격 메커니즘은 다음과 같습니다.
1. 브루트 포스 공격(Brute Force Attack): 공격자가 모든 키 조합을 공격 시도하여 암호화된 데이터를 해독하는 공격으로 키의 길이가 짧을수록 브루트 포스 공격에 의해 데이터 해독이 더 쉬워집니다.
2. 레인보우 테이블(Rainbow Table) 공격: 공격자가 미리 계산된 해시 테이블을 사용하여 해시된 키를 찾을 수 있는 공격 방법입니다.
충분하지 않은 키 길이 사용 취약점으로 발생할 수 있는 예로는, SSL/TLS 프로토콜에서 사용되는 암호화 알고리즘인 RSA에서 키 길이가 충분하지 않은 경우, 공격자가 키를 추측하거나 암호화된 데이터를 해독할 수 있습니다.
취약한 웹 애플리케이션의 예
다음은 충분하지 않은 키 길이를 사용하는 예시 코드입니다.
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.security.NoSuchAlgorithmException;
public class InsecureDESKeyLengthExample {
public static void main(String[] args) throws NoSuchAlgorithmException {
KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
// DES 알고리즘 사용
SecretKey secretKey = keyGenerator.generateKey();
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
// 암호화 수행
}
}
해당 예시 코드에서는 DES 알고리즘을 사용하여 암호화를 수행하는데, DES 알고리의 키 길이는 56비트로 설정되어 있어 현대 컴퓨팅 기술에서 브루트 포스 공격이나 레인보우 테이블 공격 등으로부터 취약합니다.
시큐어코딩 적용 방법
충분하지 않는 키 길이 사용 취약점은 다음과 같은 방법을 통하여 취약점을 보안할 수 있습니다.
- 암호화 알고리즘 선택: 충분한 키 길이를 지원하는 암호화 알고리즘을 선택합니다.
- 키 관리: 안전한 방식으로 키를 생성, 저장 및 관리합니다.
- 키 생성 시 고려 사항: 난수 생성기를 이용하여 예측하기 어려운 키를 생성합니다.
- 키 길이 검사: 키의 길이가 보안 요구 사항을 충족하는지 확인합니다.
소프트웨어 개발 보안 가이드(행정자치부 / 한국인터넷진흥원) 암호화 알고리즘에 따른 안전한 키 길이 | |
암호화 알고리즘 | 키 길이 |
대칭키 암호알고리즘(예,AES, ARID, SEED 등) | 128bit 이상 |
해시 함수(예, SHA 등) | 128bit 이상 |
공개키 암호알고리즘(예, RSA, DSA 등) | 2,048bit 이상(ECC의 경우, 256 bit이상) |
다음 예시 코드는 충분한 키 길이를 사용하여 AES 알고리즘을 적용한 예시 코드입니다.
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.security.NoSuchAlgorithmException;
public class SecureKeyLengthExample {
public static void main(String[] args) throws NoSuchAlgorithmException {
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(256); // 256비트 키 길이 설정
SecretKey secretKey = keyGenerator.generateKey();
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
// 안전한 암호화 수행
}
}
예시 코드에서는 256비트의 키 길이를 사용하여 AES 알고리즘을 적용하고 있습니다. 이렇게 충분한 키 길이를 사용하면 보다 안전한 암호화를 수행할 수 있습니다.