설명
암호 키가 필요한 보안 강도에 비해 짧으면 무차별 대입이나 알고리즘별 공격에 대한 여유가 줄어듭니다. RSA의 정수 인수분해, EC의 이산 로그 문제와 대칭키 탐색은 서로 다른 기준을 사용하므로 키의 비트 수만 직접 비교하면 안 됩니다. 실제 공격 비용은 알고리즘, 키 길이, 구현 및 보호 기간에 따라 달라집니다.
잠재적 영향
- 키가 복구되면 암호화 데이터의 기밀성이나 서명의 신뢰성이 훼손될 수 있습니다.
- 장기간 보호해야 하는 데이터는 시간이 지나 계산 능력이 증가하면서 위험이 커질 수 있습니다.
- 조직이나 적용 표준이 요구하는 최소 보안 강도를 충족하지 못할 수 있습니다.
해결 방법
- 알고리즘과 보호 기간에 맞는 보안 강도를 선택하세요. 일반적인 기준으로 RSA는 최소 2048비트, 장기 보호에는 3072비트 이상을 검토하고, EC는
secp256r1같은 검토된 곡선을 사용하세요. - AES는 128·192·256비트 키를 지원합니다. 필요한 보안 강도에 따라 선택하세요. 64비트 AES 키는 약한 유효 키가 아니라 지원되지 않는 설정입니다.
KeyPairGenerator나KeyGenerator에 검토된 길이·곡선과 보안 난수 생성기를 명시하세요. 설정에서 읽는 값에도 최소 기준을 적용하세요.- 기존 키를 교체할 때 암호문, 인증서, 서명 검증과의 호환성을 계획하세요. 충분한 키 길이는 안전한 암호 모드, 키 보관 및 접근 제어를 대체하지 않습니다.
예시
변경 전
java
import java.security.KeyPairGenerator;
public class WeakKeyExample {
public static void main(String[] args) throws Exception {
// RSA 1024비트 - 취약
KeyPairGenerator rsa = KeyPairGenerator.getInstance("RSA");
rsa.initialize(1024); // BAD: 권장 최소 2048 미만
rsa.generateKeyPair();
}
}
변경 후
java
import javax.crypto.KeyGenerator;
import java.security.KeyPairGenerator;
import java.security.SecureRandom;
import java.security.spec.ECGenParameterSpec;
public class StrongKeyExample {
public static void main(String[] args) throws Exception {
SecureRandom rnd = SecureRandom.getInstanceStrong();
// RSA 3072비트 - 권장안 충족(최소 2048 이상)
KeyPairGenerator rsa = KeyPairGenerator.getInstance("RSA");
rsa.initialize(3072, rnd);
rsa.generateKeyPair();
// EC 256비트 커브 명시 - 안전 커브 사용
KeyPairGenerator ec = KeyPairGenerator.getInstance("EC");
ec.initialize(new ECGenParameterSpec("secp256r1"), rnd);
ec.generateKeyPair();
// AES 256비트 - 충분한 키 길이
KeyGenerator aes = KeyGenerator.getInstance("AES");
aes.init(256, rnd);
aes.generateKey();
}
}
변경 전에는 RSA 1024비트 키를 생성합니다. 변경 후에는 RSA 3072비트, EC secp256r1, AES 256비트를 명시합니다. 실제 선택은 시스템의 보안 강도와 호환성 요구에 맞춰 검토하세요.