설명
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로 고정합니다. 키 길이와 별도로 난수 생성, 개인키 저장, 적절한 서명·암호화 방식도 관리해야 합니다.