취약한 RSA 키 길이 사용

취약한 RSA 키 길이 사용

설명

RSA 키가 너무 짧으면 장기간의 기밀성과 서명 보호에 필요한 보안 여유를 확보하기 어렵습니다. 1024비트 RSA는 새 시스템에 충분한 강도로 보지 않습니다. 그렇다고 모든 1024비트 키를 짧은 시간 안에 복구할 수 있다는 뜻은 아닙니다. 공격 비용은 키 크기와 사용 환경, 공격자의 자원에 따라 달라집니다.

잠재적 영향

  • 개인키가 복구되면 해당 키로 보호한 데이터를 복호화하거나 서명을 위조할 수 있습니다.
  • 장기간 보관하는 암호문과 신뢰 관계가 키의 보안 수명을 넘어 노출될 수 있습니다.
  • 짧은 키를 허용하는 호환 설정 때문에 조직의 암호 정책을 충족하지 못할 수 있습니다.

해결 방법

  • 새 RSA 키는 최소 2048비트로 생성하고, 보호 기간과 보안 요구에 따라 3072비트 이상을 검토하세요.
  • 생성 함수에 최소 길이를 적용하고 라이브러리와 서비스의 요구 사항을 확인하세요.
  • 기존의 짧은 키는 인증서, 서명 검증자, 암호문 의존성을 확인한 뒤 교체하세요. 기존 데이터 복호화에 필요한 키를 계획 없이 삭제하지 마세요.
  • 1024비트를 허용하는 레거시 호환 설정도 점검하세요.

예시

변경 전

go
package main

import (
    "crypto/rand"
    "crypto/rsa"
    "log"
)

// 취약한 예: 1024bit RSA 키 생성
func generateWeakRSAKey() *rsa.PrivateKey {
    // 1024bit는 현재 기준으로 안전하지 않은 길이
    keySize := 1024

    priv, err := rsa.GenerateKey(rand.Reader, keySize)
    if err != nil {
        log.Fatalf("failed to generate RSA key: %v", err)
    }
    return priv
}

func main() {
    _ = generateWeakRSAKey()
}

변경 후

go
package main

import (
    "crypto/rand"
    "crypto/rsa"
    "log"
)

const (
    // 권장 최소 길이: 2048bit
    MinRSAKeySize = 2048
)

// 안전한 예: 2048bit 이상 RSA 키 생성
func generateStrongRSAKey() *rsa.PrivateKey {
    keySize := MinRSAKeySize

    priv, err := rsa.GenerateKey(rand.Reader, keySize)
    if err != nil {
        log.Fatalf("failed to generate RSA key: %v", err)
    }
    return priv
}

func main() {
    _ = generateStrongRSAKey()
}

설명:

  • 변경 전: generateWeakRSAKey가 1024비트 키를 생성합니다. 새 보안 설계에서 충분한 보안 여유를 제공하지 못하는 길이입니다.
  • 변경 후: MinRSAKeySize를 2048로 고정합니다. 키 길이와 별도로 난수 생성, 개인키 저장, 적절한 서명·암호화 방식도 관리해야 합니다.

참조