본문 바로가기

암호화 알고리즘

공인인증서 (공개키 알고리즘 Usecase)

한국의 공동인증서에서는 RSA 알고리즘(비대칭키)SEED 알고리즘(대칭키)이 사용됩니다. 공동인증서는 인터넷 뱅킹, 전자세금신고, 공공기관 등에서 사용되는 인증서이며, 이를 통해 가입자의 신원을 확인하고 안전한 통신을 보장합니다. RSA 알고리즘은 대표적인 비대칭키 암호화 알고리즘으로, 공개키와 개인키를 사용해 암호화 및 복호화를 수행합니다. 공동인증서는 개인키를 보유한 가입자가 암호화한 데이터를 공개키로 복호화하여 인증서를 확인하고, 서버로부터 받은 데이터를 개인키로 복호화하여 확인합니다. 이러한 방식을 통해 공동인증서는 안전하고 신뢰성 있는 인증서비스를 제공합니다. 전체적인 구조는 PKI(public key infrastructure)로 구성됩니다.

(출처: https://www.law.go.kr/LSW/admRulInfoP.do?admRulSeq=2000000009529) 

공인인증서 발급 과정

한국전자인증에서 배포된 공동인증서 전자서명 인증 업무 준칙에 따르면 공인인증서의 발급과 가입자에게 전달하는 과정은 다음과 같이 정리됩니다: (해당 과정은 은행을 통해 공인인증서를 발급하는 상황입니다)

  1. (가입자) 공인인증서 발급 신청
  2. (은행, RA) 가입자 신원 확인
  3. (인증 기관, CA) CSR 요청
  4. (최상위 인증 기관, Root CA) CSR 검증
  5. (최상위 인증 기관, Root CA) 공인인증서 발급
  6. (인증 기관, CA) 공인인증서 & 개인키 전달
  7. (가입자) 공인인증서 & 개인키 보관

모든 과정은 TLS 통신으로 보안되며, 아래 과정에서 화살표 표기는 TLS 통신으로 전달되는 상황을 표현합니다.

1. 공인인증서 발급 신청

가입자는 공인인증서 발급 신청을 위해 개인 정보 및 신청서를 기입합니다. 신청서에는 가입자의 ID, 공인인증서에 사용할 비밀번호, 주민등록번호 or 사업자등록번호 등을 기입합니다.

2. 가입자 신원 확인

가입자의 발급 신청을 이후 인증 기관(CA)에 등록하기 위해 은행(대행기관, RA)에선 신원 확인을 진행합니다. 신원 확인을 위해 출금계좌번호, 계좌비밀번호, OTP 번호 등을 활용합니다. 신원 확인이 되면 해당 정보를 바탕으로 은행은 인증기관에 신청 정보를 등록합니다.

3. CSR(Certificate Signing Request) 요청

인증기관은 신청 정보를 바탕으로 공인인증서 생성을 위해 최상위 인증기관에 CSR을 요청합니다. CSR 요청을 받은 인증 기관은 가입자가 사용할 비대칭키 쌍을 생성합니다.

이 때, 안전성이 확인되고 신뢰성 있는 알고리즘을 사용하기 위해, HMAC-DRBG with SHA256를 이용한 2048-bit RSA 비대칭키를 생성합니다. 난수를 생성하는 DRBG(Deterministic Random Bit Generator)의 무결성을 보장해주는 메세지 인증코드 정보 (MAC)를 저장하는 HMAC 기법과, SHA256 해싱을 통해 매우 안전한 난수를 생성합니다. 해당 난수 정보를 PRNG(pseudo-random number generator)에 대입하여 소수 p, q를 생성합니다. 해당 소수로 가입자가 사용할 2048-bit RSA 비대칭키를 생성합니다.

4. CSR 생성

인증기관에서 CSR을 생성합니다. CSR에는 다음과 같은 정보가 포함됩니다:

  1. 공개키(Public Key): 인증서를 발급받을 가입자의 공개키가 포함됩니다.
  2. 개인정보(Subject Information): 인증서를 발급받을 가입자 정보가 포함됩니다. 주로 이름, 이메일 주소, 조직명, 국가/지역 등이 포함됩니다.
  3. 알고리즘(Algorithm): 인증서를 생성하는 데 사용될 알고리즘 정보가 포함됩니다.
  4. 서명(Signature): 가입자의 개인키를 사용하여 생성된 디지털 서명이 포함됩니다. CSR에서 서명 부분을 제외한 모든 내용은 SHA256으로 해싱 되고, 이전에 생성한 가입자의 개인키로 암호화되어 (RSA 알고리즘) 디지털 서명이 생성됩니다.
  5. 확장정보(Extension Information): 인증서에 추가적인 정보를 포함시키기 위한 확장 필드 정보가 포함됩니다. 예를 들어, Key Usage, Extended Key Usage, Subject Alternative Name 등의 정보가 포함될 수 있습니다.

유효한 CSR가 작성되면 인증기관은 최상위 인증기관으로 CSR을, 인증기관 자신의 개인키로 서명하여 전달합니다.

5. 공인인증서 발급

최상위 인증기관은 유효한 CSR을 요청받으면 공인인증서를 발급합니다. 최상위 인증기관 자신의 개인키로 공인인증서를 서명하고, 인증기관으로 전달합니다.

공인인증서는 X.509 인증서 표준으로 생성되며, 다음과 같은 정보가 포함됩니다:

  1. 인증서의 버전 정보
  2. 가입자 공개키(Public Key)
  3. 가입자 대상자(Subject)의 이름, 이메일 주소, 조직, 국가 등의 정보
  4. 최상위 인증 기관의 정보 (Root CA)
  5. 인증 기관의 정보 (CA)
  6. 인증서에 대한 고유 식별자(Serial Number)
  7. 인증서의 유효기간, 즉 발급일자와 만료일자
  8. 인증서를 발급한 최상위 인증 기관의 디지털 서명

6. 공인인증서 & 개인키 전달

인증기관에는 공인인증서와 함께 가입자의 개인키를 전달합니다. 개인키는 가입자가 사용하는 보안 모듈에서 SEED 알고리즘을 통해 암호화 됩니다. SEED 알고리즘은 PKCS#8(Private-Key Information Syntax Standard) 표준을 통해 가입자가 초기에 입력한 비밀번호을 사용하여 암호화 됩니다.

7. 공인인증서 & 개인키 보관

공인인증서와 개인키는 가입자의 컴퓨터 또는 스마트폰에 보관됩니다.

이후 은행 업무를 수행하기 위해 보안 모듈을 실행하면, 보안 모듈을 통해 가입자의 공인인증서 전자서명을 검증할 수 있습니다. 가입자의 공개키는 공인인증서 형태로, 개인키는 SEED 알고리즘으로 암호화된 형태로 저장되며, 가입자 외의 인증기관이나 대행기관에는 공개키&개인키 정보를 저장하지 않습니다.


+ 전자서명 검증 과정

전자서명에 대한 표준 PKCS #7(Cryptographic Message Syntax)에 따른 공인인증서는 다음과 같은 원리로 이루어집니다.

보안 모듈에서는 가입자 검증을 위해 다음과 같은 과정을 수행합니다:

  1. 저장된 공인인증서를 불러옵니다
  2. 가입자의 비밀번호를 입력받아서 SEED 알고리즘으로 개인키를 복호화합니다.
  3. 복호화한 개인키에서 비트열 난수값 R을 생성합니다.
  4. VID = h(h(IDN, R), 가입자의 식별번호 IDN, 가입자의 개인키에서 추출한 R값으로 가상 식별번호 VID 값을 생성합니다. 이때 사용되는 해쉬 함수 h()는 SHA-256입니다.
  5. 보안모듈에선 EVID = E(VID, R)으로 암호화해서 인증기관으로 전송합니다. 이때 암호화 함수 E()는 SHA256 With RSA이며, 공개키는 공인인증기관의 인증서에 추출되어 사용됩니다.
  6. 인증기관에선 인증기관의 개인키로 EVID를 복호화해서 가입자가 전송했던 VID와 R값을 추출합니다.
  7. 인증기관은 VID' = h(h(IDN, R))으로 VID' 값을 계산합니다. 이때 IDN은 가입자가 처음 공인인증서를 신청할때 인증기관에 등록되어있는 가입자 식별번호입니다.
  8. VID = VID'이면 신원확인이 완료됩니다.

참조: http://www.rootca.or.kr/kcac/down/TechSpec/1.5-KCAC.TS.SIVID.pdf


+ 보안 취약점, 공인인증서 복사 프로그램

현재의 공인인증서는 하나의 기기에서 다른 기기로 복사할 때 발생하는 보안 취약점이 있습니다. 현재 공인인증서는 PRNG(Pseudo Random Number Generator)를 사용하는 인증서복사 프로그램을 사용하고 있습니다. 주요 시중은행 10개사에서 사용하고 있는 스마트폰 공인인증서 복사 프로토콜은 인증번호를 기반으로 이루어지고 있으며. 짧게는 8자리, 길게는 16자리의 인증번호를 사용합니다. 인증번호의 크기는 8자리의 경우 27비트, 12자리는 40비트, 16자리는 52비트로, 그 키의 크기가 최근에 요구되는 비밀키의 크기에 비해서 상대적으로 작기 때문에 공격자는 무작위 공격을 시도해 무선으로 도청한 패킷을 복호화하여 사용자의 공인인증서와 개인키를 탈취할 수 있게 됩니다. 이후 공격자는 오프라인 사전 탐색 공격 등을 통하여 개인키를 얻어낼 수 있게 되고, 사용자와 동일하게 공인인증서를 사용한 업무를 수행할 수 있게 됩니다.

참조: 스마트폰뱅킹을 위한 공인인증서 복사 프로토콜의 취약점 분석, https://koreascience.kr/article/JAKO201236135721120.pdf