PKI Bootcamp - 디지털 서명

__〆( ̄ー ̄ ) ·2023년 6월 22일
1

PKI Bootcamp

목록 보기
4/4

이번 장에서는 디지털 서명에 대해서 조금 더 자세하게 다루려고 합니다. 이 문서의 내용은 아래의 표준 문서들을 토대로 작성되었어요.

  • PKCS#1(RSA Cryptograpghy Specification Version 2.1, RFC 3447): RSA 암호화와 관련된 표준으로, RSA 키의 생성, 암호화, 복호화, 디지털 서명 등을 정의하는 표준
  • PKCS#7(Cryptographic Message Syntax Version 1.5, RFC 2315): 암호화된 데이터와 디지털 서명을 포함하는 데이터 형식을 정의하는 표준
  • CMS(Cryptographic Message Syntax, RFC 5652):: 전자 서명, 암호화, 인증서 관리 등 다양한 암호학적 작업을 수행하기 위한 일반적인 데이터 형식을 정의하는 표준 (RFC 2315 문서의 확장 버전)

여기서 PKCS는 Public-Key Cryptography Standards의 약어로 공개 키 암호 시스템에 대한 절차와 데이터 형식 등에 대한 표준으로 여러 시리즈가 있습니다.

이 밖에도 XAdES(XML Advanced Electronic Signatures, XML 전자 서명), PAdES (PDF Advanced Electronic Signatures, PDF 전자 서명), CAdES (CMS Advanced Electronic Signatures, CMS 기반의 고급 전자 서명) 등 다양한 표준이 있고 모두 위의 표준들을 확장한 개념들이에요.

TL;DR

  • 디지털 서명의 원리에 대해 알수 있어요
  • 다양한 형태의 디지털 서명에 대해 알 수 있어요.

용어

이 문서에서 전자 서명과 디지털 서명에 대한 용어를 혼용해서 사용하고 있어요. 전자 서명이 보다 포괄적인 개념이지만 이 문서에서는 같은 것을 가르키고 있습니다.

  • 전자 서명: 전자 서명은 전자적인 형태로 데이터의 무결성을 보장하는 기술
  • 디지털 서명: 공개 키 암호화 기술을 사용하여 생성되는 전자 서명의 한 형태.
  • Signature: 가장 기본적인 형태의 디지털 서명

디지털 서명

디지털 서명은 PKI 소개에서 설명한 것과 같이 공개 키 암호 시스템의 기능 중 하나에요.
디지털 서명 예시

디지털 서명은 아래의 4가지 기본 원리를 통해 작동합니다.

  • 개인 키(Private Key): 개인 키는 안전한 장소에 보관되어 소유자만이 사용할 수 있어야 서명의 주요 요건인 부인 방지를 만족할 수 있어요.
  • 해시 함수(Hash Function): 해시 함수는 임의의 입력 데이터를 고정된 크기의 해시 값으로 변환하는 기능을 해요. 이 기능을 사용하는 이유는 아래에서 다시 설명드릴게요.
  • 개인 키로 암호화: 서명자는 원문 메시지를 개인 키로 암호화해요. 이 암호화된 결과가 곧 디지털 서명 데이터입니다.
  • 공개 키로 복호화: 수신자는 서명자의 공개 키로 디지털 서명 데이터를 복호화해요. 복호화한 결과가 원문 메시지의 해시 값과 동일하다면 그 원문 메시지를 서명자가 서명 했음을 확인할 수 있어요.

디지털 서명의 형태는 여러가지가 있는데 가장 기본적인 형태는 PKCS#1 문서(Chapter 8. Signature schemes with appendix)에 소개되어 있어요.


Signature schemes with appendix

PKCS#1에는 위의 기본 원리를 바탕으로 하는 디지털 서명 생성 절차와 검증 절차가 정의되어 있어요. RSA 알고리즘을 기준으로 작성되어 있지만 다른 공개 키 암호 알고리즘을 이용한 서명에도 동일하게 적용됩니다. 이 기본적인 디지털 서명을 앞으로는 Signature라고 하겠습니다.

해당 장에서는 두 가지 서명 스킴인 RSASSA-PKCS1_v1_5와 RSASSA-PSS을 소개하고 있어요. RSASSA는 RSA Signature Scheme with Appendix의 약어입니다. 각 서명 형식에 대해 간략하게 설명드리면 다음과 같습니다.

  • RSASSA-PKCS1_v1_5: 일반적인 해시 함수를 사용하며 랜덤성을 위해 일정 길이의 랜덤 비트(패딩, Padding)를 해시 값에 추가하는 방식
  • RSASSA-PSS (Probabilistic Signature Scheme): Salted 해시 함수를 사용하며 랜덤성을 위해 MGF(Mask Generation Function)을 이용해 랜덤한 Mask를 생성하고 이를 해시 값과 결합(XOR 연산)하는 방식

각 서명 형식에 대한 자세한 설명은 수학적인 부분이라서 하지 않고 서명 형식에서 공통적으로 언급되고 있는 해시 함수랜덤성에 대해 설명드릴게요.

해시 함수 (Hash Function)

해시 함수는 임의의 입력 데이터에 대해 고정된 크기의 해시 값을 생성하는 기능을 해요. 아래와 같은 특징을 가지고 있어서 디지털 서명에 꼭 필요한 기능입니다.

  • 일방향성: 해시 함수는 입력된 데이터로부터 해시 값을 생성하는 것만 가능하고 해시 값을 통해 원래의 데이터를 복원하는 것이 불가능해요.
  • 고정된 출력 크기: 해시 함수는 입력 데이터의 길이와 상관 없이 고정된 길이의 해시 값을 생성해요.
  • 충돌 저향성: 해시 함수는 서로 다른 입력 데이터가 동일한 해시 값을 가질 확률이 매우 낮아요.

일반적으로 공개 키 암호 알고리즘은 고정 길이의 입력 데이터를 처리하는데 적합하며 (고정된 출력 크기), 보안 측면에서 서명 데이터의 기밀성 (일방향성) 확보가 필요합니다. 또한 서명 데이터에 대한 부인 방지(충돌 저향성)를 위해 디지털 서명 시 해시 함수가 사용됩니다.

랜덤성 (Randomness)

디지털 서명에서의 랜덤성은 같은 원문 메시지에 대해 생성되는 서명 값이 항상 달라야 되는 걸 의미해요. 그 이유는 다음과 같습니다.

  • 비밀성 보호: 서명 값이 항상 동일한 경우 대입 공격을 통해 개인 키를 유추할 수 있어요. 랜덤성은 이를 어렵게 하여 개인 키의 비밀성을 보호해요.
  • 서명의 고유성: 서명 값이 항상 다르기 때문에 동일 데이터에 대해 동일한 서명이 생성되는 것을 방지하여 디지털 서명에 대한 고유성을 확보할 수 있어요.
  • 보안 강화: 서명 값이 항상 다르고 생성에 대한 규칙이 없기 때문에 임의로 서명 값을 재생산하거나 위조하는 것을 어렵게 해요.

수신자(Receiver)는 디지털 서명을 검증하기 위해서 3가지 요소(원문 메시지, 서명자의 인증서, 서명 데이터)가 필요해요. 이들을 모두 따로 전달하는 것은 번거로우며 추가적인 보안 처리가 필요합니다. 그래서 제안된 서명 형식이 Signed-data 입니다.

Signed-data

Signed-data는 서명 검증에 필요한 정보들을 모두 포함하고 있어서 서명 데이터만으로 검증이 가능해요. 이 데이터 형식에 대한 정의는 PKCS#7(RFC 2315)와 CMS(RFC 5652)에 정의되어 있어요. (RFC 5652는 RFC 2315를 확장한 최신 표준입니다.)

다음은 Signed-data가 포함하고 있는 정보들이에요.

  • 버전 (version): Signed-data 구조의 버전을 나타냅니다.
  • 컨텐츠 (encapContentInfo): 서명이 적용되는 대상 데이터를 나타냅니다. 원본 데이터의 형식과 실제 데이터가 포함됩니다.
  • 인증서 목록 (certificates): 인증서는 서명자의 공개 키와 신원을 확인하는 데 사용됩니다.
  • 서명자 정보 목록 (signerInfos): 서명자 정보는 서명자의 신원 정보와 서명에 사용된 알고리즘 등을 포함합니다. 각 서명자 정보에는 서명자의 인증서와 서명 값이 포함됩니다.

위와 같이 Signed-data는 encapContentInfo (원문 메시지), certificates (인증서 정보), signerInfos (서명 정보)를 포함하고 있기 때문에 이 데이터 자체로 서명 검증이 가능합니다. signerInfos의 서명 값은 PKCS#1의 정의된 서명 형식 중 하나로 생성됩니다.

signerInfos에는 authenticatedAttributes라는 Optional 요소가 있는데 만약 이 요소가 주어지는 경우 서명 시 원문 메시지가 아니라 authenticatedAttributes를 해시하여 서명해요. 서명 검증이 실패할 때 이 부분을 놓쳐 원인을 못 찾는 경우가 종종 있어요.

대부분의 전자 서명 표준은 이 서명 형식을 기반으로 동작해요. 위에서 언급한 XAdES, PAdES는 Signed-data의 생성과 XML 문서 또는 PDF 문서에 포함하는 방법에 대한 정의를 내리고 있어요.

Signed-data는 한 가지 보안상의 문제가 있는데 서명 대상인 원문 메시지가 그대로 공개 기밀성을 확보하지 못한다는 것 입니다. 만약 개인정보를 포함하고 있거나 계약과 같은 민감한 정보인 경우 문제가 될 수 있어요. 이때 사용할 수 있는 서명 형식은 Signed-and-enveloped-data 입니다.

Signed-and-enveloped-data

이 서명 형식 또한 PKCS#7(RFC 2315)와 CMS(RFC 5652)에 정의되어 있어요. 먼저 Enveloped-data에 대해 간단하게 설명하겠습니다.

Enveloped-data
Enveloped-data는 공개 키 암호 시스템의 기능 중 암호화와 관련된 표준으로 동일한 표준 문서에 정의되어 있어요. 이 데이터 구조는 어떤 정보를 수신자만 확인할 수 있게 데이터를 대칭키로 암호화하고 대칭키를 수신자의 공개키로 암호화하여 암호화된 정보와 함께 전달합니다.

Signed-and-enveloped-data는 Signed-data의 encapContentInfo 항목을 암호화하여 특정 수신자만 원문 메시지를 확인하고 서명을 검증할 수 있게 합니다.

다음은 Signed-and-enveloped-data가 포함하고 있는 정보들이에요.

  • 버전 (Version): Signed-and-enveloped-data 구조의 버전을 나타냅니다.
  • 수신자 정보 (RecipientInfos): 수신자 정보는 암호화에 사용되는 대칭키를 보호하는 수신자의 정보를 포함합니다. 수신자 정보는 여러 수신자에 대한 정보를 담을 수 있습니다. 각 수신자 정보는 수신자의 공개 키로 암호화된 대칭키를 포함합니다.
  • 인증서 목록 (certificates): 인증서는 서명자의 공개 키와 신원을 확인하는 데 사용됩니다.
  • 서명자 정보 목록 (signerInfos): 서명자 정보는 서명자의 신원 정보와 서명에 사용된 알고리즘 등을 포함합니다. 각 서명자 정보에는 서명자의 인증서와 서명 값이 포함됩니다.
  • 암호화된 컨텐츠 (EncryptedContentInfo): 암호화된 컨텐츠 정보는 암호화된 데이터의 형식과 암호화된 데이터 자체를 포함합니다. 암호화된 컨텐츠 정보에는 암호화 알고리즘 식별자와 암호화된 데이터가 포함됩니다.

Signed-data에서 컨텐츠가 암호화된 컨텐츠로 바뀌었고 이를 복호화하기 위한 수신자 정보가 추가 되었어요.

Detached-signed-data

Detached-signed-data는 Signed-data의 컨텐츠 항목이 분리되어 있는 서명 데이터에요. 정식 명칭이 있는 서명 형식은 아니에요 다만 CMS(RFC 5652) 표준에서 언급하고 있는 서명 방식 중 하나라서 설명드리려고 해요.

다음은 Detached-signed-data가 포함하고 있는 정보들이에요.

  • 버전 (version): Signed-data 구조의 버전을 나타냅니다.
  • 인증서 목록 (certificates): 인증서는 서명자의 공개 키와 신원을 확인하는 데 사용됩니다.
  • 서명자 정보 목록 (signerInfos): 서명자 정보는 서명자의 신원 정보와 서명에 사용된 알고리즘 등을 포함합니다. 각 서명자 정보에는 서명자의 인증서와 서명 값이 포함됩니다.

Signed-data에서 컨텐츠 항목이 없는 것만 달라요. 실제로 Detached-signed-data를 생성할 때는 원문 메시지이 없이 원문 메시지의 해시 값만을 가지고 서명 데이터를 생성합니다.

이 서명 방식은 원문 메시지가 매우 크거나 다른 곳에 있을 경우 유용해요. PDF(PaDES)나 XML(XaDES) 문서 서명과 같이 문서가 매우 크거나 실제 문서의 보관 위치가 서명자와 떨어져 있을 경우, 해당 문서에 해시 값만 전달하여 서명하는 방식을 취합니다.


이번 장에서는 디지털 서명의 원리와 형식들에 대해 알아 보았어요. 다음 장에서는 디지털 인증서의 발급과 관리에 대해 알아보겠습니다.

profile
뭐라도 적자

0개의 댓글