OAEP 없이 RSA 사용
Use of RSA Without OAEP
설명
RSA는 안전한 암호화를 위해 패딩이 필수입니다. PKCS#1 v1.5 패딩(PKCS1Padding)이나 NoPadding을 사용할 경우, 평문 구조가 예측 가능해지고 에러 메시지/타이밍 차이를 통한 패딩 오라클(Bleichenbacher) 공격에 노출될 수 있습니다. 공격자는 응답의 차이를 관찰해 암호문을 단계적으로 복호화하거나 메시지를 변조할 수 있습니다.
잠재적 영향
평문 노출 (Plaintext Disclosure): 패딩 오라클을 악용하여 암호화된 비밀값(토큰, 세션 키, 개인정보)을 복호화할 수 있습니다.
자격 증명/토큰 탈취 (Credential/Token Exposure): 로그인 토큰, API 키 등 민감한 값이 유출되어 계정 탈취로 이어질 수 있습니다.
무결성 훼손 및 메시지 변조 (Integrity Compromise): NoPadding 또는 취약한 패딩은 암호문 가변성(malleability)로 인해 의미 있는 변조를 허용할 수 있습니다.
보안 수준 강등 (Security Downgrade): 안전한 OAEP 대신 구식 패딩을 허용하면 시스템 전반의 암호 강도가 약화되고 다른 공격과 결합될 수 있습니다.
해결 방법
항상 OAEP 패딩을 사용하십시오: Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding").
가능한 경우 OAEP 파라미터를 명시하십시오: OAEPParameterSpec(SHA-256, MGF1 with SHA-256, PSource.PSpecified.DEFAULT).
기존 코드에서 "RSA", "RSA/ECB/PKCS1Padding", "RSA/ECB/NoPadding" 사용을 모두 금지하고 OAEP로 전환하세요. 구버전/특정 프로바이더만 지원 시 OAEPWithSHA-1AndMGF1Padding이라도 사용하고, 가능하면 최신 프로바이더로 업그레이드하세요.
에러/예외 처리를 균일하게 하여 복호화 실패 원인을 구분 못 하게 하십시오(오라클 형성 방지).
실제 서비스에서는 하이브리드 암호화를 적용하세요: 데이터는 AES-GCM으로 암호화하고, 무작위 세션 키를 RSA-OAEP로 래핑.
키 길이 최소 2048비트 이상을 사용하고, 최신 JCA/JCE 프로바이더를 적용하세요.
취약한 코드 및 안전한 코드 예시
취약한 코드
안전한 코드
설명:
취약한 코드: PKCS#1 v1.5 패딩은 역사적으로 패딩 오라클 공격에 취약하며, 오류 유형/타이밍 차이를 통해 공격자가 암호문을 점진적으로 복호화할 수 있습니다. NoPadding은 결정적이고 가변성(malleable)이 있어 평문 구조가 드러나거나 변조가 가능합니다.
안전한 코드: OAEP는 무작위화를 통해 RSA에 의미론적 안전성(IND-CPA)을 제공하며, MGF1(SHA-256)과 함께 사용 시 현재 권장되는 안전한 구성입니다. 파라미터를 명시하여 프로바이더 간 동작을 일관화하고, 복호화 실패 시 동일한 에러 처리로 오라클 형성을 방지합니다.
참조
Last updated