파일용 디지털 서명: 진위와 출처 증명
디지털 서명이 파일 진위를 검증하고 변조를 방지하는 방법을 알아보세요. 수신자가 발신자와 무결성을 확인하게 하세요.
디지털 서명은 특정 인물 또는 단체가 파일을 만들었으며 그 이후로 파일이 변경되지 않았다는 암호화 증명입니다. 기술적으로는 SHA-256으로 파일을 해시하고, RSA-PSS, ECDSA, 또는 Ed25519로 개인 키를 사용하여 그 해시에 "서명"합니다. 공개 키를 가진 누구나 서명을 검증할 수 있습니다 — 검증이 되면 해당 인물이 파일을 작성했으며, 서명 이후 바이트 단위로 동일하다는 것을 알 수 있습니다. 서명은 macOS가 앱 업데이트를 검증하고, Git이 커밋 발신자를 확인(git commit -S)하고, PGP가 서명된 이메일에 사용하는 방식입니다. 암호화만으로는 해결할 수 없는 문제, 즉 누가 무엇을 보냈는지 증명하는 것을 해결합니다.
서명 vs 암호화: 다른 역할
암호화는 내용을 비밀로 유지합니다. 서명은 발신자와 무결성을 증명합니다. 둘은 상호 보완적이며 대안이 아닙니다.
- 암호화만: 수신자는 내용을 알지만 누가 보냈는지 모릅니다.
- 서명만: 수신자는 누가 보냈고 변조되지 않았음을 알지만, 내용은 중간에 가로채는 누구에게도 보입니다.
- 서명 및 암호화: 완전한 진위성, 무결성, 기밀성. PGP의 기본 모드입니다.
파일 전송 서비스는 일반적으로 암호화에 초점을 맞춥니다. 서명은 고신뢰 컨텍스트에서 적용됩니다: 소프트웨어 배포, 법적 문서, 계약서, 법의학적 증거 체인.
서명의 실제 작동 방식
Ed25519 서명의 표준 흐름:
- 메시지 해시:
h = SHA-512(message). - 결정론적 nonce 계산:
r = SHA-512(private_key_prefix || h). - 서명 점 계산:
R = r·G(G는 곡선의 기저점). s = r + SHA-512(R || public_key || h)·private_key mod ℓ계산.- 서명은
(R, s), 총 64바이트.
검증은 공개 키, 메시지, 서명만 사용합니다. 수학이 맞으면 검증자는 서명이 일치하는 개인 키를 보유한 사람에 의해 생성되었음을 알 수 있습니다.
RSA-PSS(PKCS#1 v2.2)와 ECDSA는 다른 기반 수학으로 유사하게 작동합니다. Ed25519는 결정론적(서명당 무작위 nonce가 잘못될 위험 없음)이고 더 빠르기 때문에 새로운 시스템에서 선호됩니다.
세 가지 일반적인 서명 알고리즘 비교
| 알고리즘 | 키 크기 | 서명 크기 | 속도 | 비고 | |---------|--------|---------|------|-----| | RSA-PSS-2048 | 256바이트 | 256바이트 | ~1,000 서명/초 | 광범위 지원, 키 생성 느림 | | ECDSA P-256 | 32바이트 | 64바이트 | ~30,000 서명/초 | NIST 곡선, 서명당 안전한 RNG 필요 | | Ed25519 | 32바이트 | 64바이트 | ~50,000 서명/초 | 결정론적, 현대 기본값 |
세 가지 모두 NIST의 FIPS 186-5(2023)에서 승인되었습니다. Ed25519는 WireGuard, SSH(OpenSSH 8.0 이후 기본값), Signal, Git 커밋 서명, Rust의 Cargo 패키지 서명에서 새로운 프로토콜의 선택입니다.
코드 서명: 수천억 달러 규모의 사용 사례
소프트웨어 배포는 서명에 의존합니다. 서명 없이는 사용자가 실제 설치 프로그램과 악성코드를 구별할 수 없습니다.
- Apple Developer ID + 공증: Catalina(2019) 이후 모든 macOS 앱은 서명 및 공증을 받아야 합니다. RSA-2048 또는 ECDSA P-256 사용.
- Microsoft Authenticode: RSA-3072 또는 ECDSA P-384 인증서로 서명된 Windows 실행 파일.
- Android APK v2/v3: APK 내용에 대한 Ed25519 서명.
- Debian apt, Red Hat dnf, npm, PyPI, Homebrew: 모두 패키지 매니페스트에 대한 분리 서명(일반적으로 GPG Ed25519 또는 RSA) 사용.
유명한 사건: 2020년 SolarWinds의 Orion 업데이트는 공격자가 빌드 시스템을 침해한 후 회사의 합법적인 인증서로 서명되었습니다. 서명은 유효했지만 그것이 코드가 침해된 출처에서 왔다는 것을 증명했을 뿐입니다. 서명은 서명자의 신원을 보장하지, 서명자의 판단을 보장하지 않습니다.
파일을 위한 PGP와 분리 서명
GnuPG(gpg)는 기업 PKI 외부에서 파일 서명의 주력으로 남아 있습니다. 분리 서명은 파일을 수정하지 않고 서명을 별도의 .sig 파일에 넣습니다.
gpg --detach-sign --armor document.pdf
# document.pdf.sig 생성
gpg --verify document.pdf.sig document.pdf
# gpg: Alice <alice@example.com>의 유효한 서명
PGP의 약점은 키 배포입니다: 검증자가 서명 키가 실제로 Alice에게 속하는지 어떻게 알 수 있을까요? 키서버, 신뢰의 웹, keybase.io, 또는 대역 외 검증(명함의 공개된 지문) 등이 옵션입니다.
현대 대안: Sigstore(Kubernetes, npm에서 사용)는 OIDC 신원 토큰을 사용하는 키리스 서명을 하며, 투명성 로그가 신뢰의 웹을 대체합니다. Frank Denis의 minisign은 PGP의 복잡성 없이 간단한 Ed25519 서명을 제공합니다.
타임스탬핑: 언제를 증명하기
서명은 누구를 증명하지만 언제는 증명하지 않습니다. 개인 키를 훔친 공격자는 서명을 과거 날짜로 작성할 수 있습니다. 신뢰할 수 있는 타임스탬핑 기관(TSA)은 서명 위에 타임스탬프를 서명하여 특정 시점에 고정합니다.
표준:
- RFC 3161 타임스탬핑: Microsoft Authenticode, Adobe PDF 서명에 사용.
- RFC 5544(타임스탬프 포함 CMS).
법적 문서 서명(DocuSign, Adobe Sign, EU eIDAS 적격 서명)은 계약이 서명된 시점을 확립하기 위해 신뢰할 수 있는 기관의 RFC 3161 타임스탬프에 의존합니다.
파일 전송에서의 서명
대부분의 소비자 대상 파일 전송 서비스는 서명을 직접 노출하지 않습니다 — AES-GCM 인증 태그가 전송 내 무결성을 증명하고, TLS가 서버의 신원을 증명하지만, 발신자의 신원을 증명하는 내장 방법이 없습니다.
고신뢰 전송의 경우 서명은 업로드 전에 이루어집니다.
- 발신자가 Ed25519 또는 PGP로 파일에 서명하여
file.ext와file.ext.sig를 생성합니다. - 두 파일을 임의의 전송 서비스(HexaTransfer, SwissTransfer, WeTransfer)에 업로드합니다.
- 수신자가 두 파일을 다운로드하고 발신자의 공개 키로 서명을 검증합니다.
이렇게 하면 진위성과 전송 메커니즘이 분리됩니다 — 발신자의 개인 키가 비밀로 유지되고 수신자가 올바른 공개 키를 가지고 있는 한, 전송 서비스가 침해되더라도 서명의 유효성이 깨지지 않습니다.
EU eIDAS 적격 서명
EU의 eIDAS 규정(EU 910/2014, 2024년 eIDAS 2.0으로 개정)은 세 가지 서명 계층을 정의합니다.
- 전자 서명: 기본, 스캔된 수기 서명 포함.
- 고급 전자 서명(AES/AdES): 서명자에 연결되고 변조를 감지합니다. PGP 서명이 해당합니다.
- 적격 전자 서명(QES): AdES에 신뢰 서비스 제공자의 적격 인증서 추가, 적격 서명 생성 장치(스마트카드 또는 HSM)에 저장.
QES는 모든 EU 회원국에서 자필 서명과 동일한 법적 효력을 갖습니다.
서명이 과도한 경우
모든 파일이 서명이 필요하지는 않습니다. 다음의 경우 건너뛰십시오.
- 수신자가 전송 채널을 엔드투엔드로 신뢰하는 경우(Signal, 직접 USB).
- 내용이 보안에 중요하지 않은 경우(회의 사진, 레시피, 초안 문서).
- AES-GCM 또는 TLS가 제공하는 무결성만으로 충분한 경우.
다음의 경우 서명을 추가하십시오.
- 법적 또는 계약적 중요성이 있는 경우(계약서, 법원 증거, 의료 기록).
- 소프트웨어 릴리즈, 펌웨어 업데이트처럼 공급망 신뢰가 관련된 경우.
- 파일이 신뢰할 수 없는 중개자를 통해 전달되는 경우.
- 원래 전송 이후에도 지속되는 감사 추적이 필요한 경우.
hexatransfer.com에서 사용해 보세요 — 무료, 계정 불필요, 최대 10GB.
엔드투엔드 암호화로 대용량 파일을 안전하게 전송
엔드투엔드 암호화로 최대 10GB의 파일을 무료로 전송하세요. 계정이 필요하지 않습니다. 업로드 전에 브라우저에서 파일이 암호화되어 다른 사람은 읽을 수 없습니다.
파일 보내기