본문 바로가기

1.관리 및 아키텍처/Architecture

OpenPGP에서 인증 방식

최근 Beautiful Code을 보다가 보안통신을 보았다. 여기서 주요 내용은 perl을 이용해서 쉬우면서고 강력한 보안 메일 시스템을 만들었다는 것이다. perl 기반으로 암호화된 메일 구현하시는 분의 여기서 소개되는 메일관련 모듈을 참고하면 도움이 될 듯 하다. 그러나 나의 관심을 끈 것은 암호화에 사용되는 키 관리 및 인증 방식이다. 바로 PGP였다. 여러 명이 동시에 사용되고, 원격에서 이런 키 관리가 쉽지 않은 문제이다. 그렇기 때문에 더 관심을 가지게 되었다. 그러다가 OpenPGP에 대해서 알게 되었다.
그래서 여기에서는 OpenPGP에서 사용하는 키관리 및 인증 방식에 대해서 알아보려고 한다.

작성자: Ospace (ospace114 at empal.com) http://ospace.tistory.com

전자우편 보안

일반적인 이메일(SMTP)은 일반 평문 텍스트를 전송하는 프로토콜이다. 이진 데이터도 전송하지 못한다. 그러나 이를 전송하는 규약을 새로 추가했다.
평문으로 전송하다 보니 다른 사람에 의해서 훔쳐볼 수 있다. 메시지를 암호화하는 방식이 필요했다. 가장 많이 사용하는 방식이 PGP와 PEM이다.

PEM

IETF에서 만들었다. 중앙집중화된 키 인증 방식을 사용하며, 익명의 사용자를 허용하지 않은다. 높은 보안성을 제공하고 있어서 군이나 은행에서 주로 사용하고 있다. 구현이 쉽지않고 복잡해서 많이 사용하고 있지는 않다고 한다.

PGP

Phil Zimmerman이 만들었다. 훌륭한신 분이다. 분산화된 키 인증 방식을 사용하고 있고, 익명의 사용자를 허용하고 있다. 구현이 쉽고 많이 사용하는 방식이다.

PGP

공개키를 사용하여 암호화하고 있다. 여기서 사용되는 일반적인 메시지 암호화, 서명에 대한 구조를 간단히 살펴보자.
사용하는 기능에 따라서 사용하는 알고리즘이 별도로 있다.

  • 인증: IDEA(128bit키), RSA
  • 서명: RSA, MD5(해쉬함수)
  • 압축: ZIP
  • E-mail: Radix-64

다음으로 넘어기기 전에 여기서 사용할 기호를 정의하겠다.

  • K_s(Key session): 사용할 세션키
  • KR_a(Key pRivate a): 공개키에 사용할 사용자 A의 개인키(pRivate)
  • KU_a(Key pUblic a): 공개키에 사용할 사용자 A의 공개키(pUblic)
  • ER(Encrypt RSA): RSA를 이용한 공개키 암호화
  • DR(Decrypt RSA): RSA를 이용한 공개키 복호화
  • EI(Encrypt IDEA): IDEA를 이용한 공개키 암호화
  • DI(Decrypt IDEA): IDEA를 이용한 공개키 복호화
  • H: Hash Function
  • ||: 메시지 합침
  • Z: Zip 알고리즘을 이용한 압축
  • R64: Radix 64 ascii 형식으로 변환

인증 및 서명

먼저 인증과 서명하는 방식을 보자.

일반적인 형식이다. 일단 메시지에서 해쉬값을 추출하고, 이를 암호화하고 기존 메시지와 보낸다. 수신자는 해쉬값 부분을 추출하고 원래 해쉬값은 상대방 개인키로 암호화했기에 다시 암호화는 불가능하다. 아무나 서명을 할 수 없게 된다. 다시 메시지에서 암호화된 해쉬값을 복호화하고 메시지에서 해쉬값을 생성하여 비교한다. 그러면 메시지 내용이 변경이 없는지 해당 상대방이 서명한 것이 맞는지 검증가능하다.
서명할 때에 RSA 알고리즘을 사용하고 있다.

기밀성

다음으로 메시지 암호화이다. 압축을 통해서 크기를 줄이기도 하지만 원본 텍스트를 인식할 수 없기에 공격으로 쉽게 복호화하지 못하게 했다. 그리고 메시지 암호화에는 세션 키를 별도로 사용해서 사용하고 있다. 상대방의 공개키로 세션 키를 암호화하기 때문에 해당 상대방만 세션 키를 획득하여 복호화할 수 있다.
메시지 암호할 때에는 IDEA 알고리즘을 사용했지만, 세션 키는 RSA 알고리즘을 이용하여 암호화하고 있다.

PGP 메시지

이를 하나로 합치면 다음과 같다. 서명과 메일을 합친 메시지를 암호화하여 전송하게 된다. 당연히 수신자는 역순으로 복호화하고 메시지에서 서명을 검증하게 된다. 또한 e-mail은 50K Byte이하가 한번에 전송되기 때문에 쪼개서 전송한다. 당연히 상대방은 자동으로 합친다.
아래가 서로 주고받는 중간 메시지이다.

PGP 최종 메시지 처리

앞의 그림은 1대1 관계에서 미리 정해진 키로 암호화하고 서명를 하는 형태이다. 실제는 미리 정해진 키도 없지만, 한명이 여러 사용자와 메시지를 주고 받아야 한다.
그럼 다양한 사용자들과 어떻게 메시지를 주고 받을까? PGP에서는 Private key ring과 Public key ring이 있다. Private key ring은 자신의 개인키와 공개키 관리하기 위해 사용되며, Public key ring은 공개키 관리하기 위한 목적이다. 그렇기 때문에 자신의 개인키가 Private key ring에서 관리되며, 다른 사람들의 공개키가 Public key ring에서 관리된다.
Private key ring이 한 개만 존재하면 되는데 굳이 여러 개가 필요할까? 자신이 여러 키를 생성할 수 있기 때문이다.

개인 키 링에 포함되는 내용

  • timestamp: 키 쌍이 생상된 날짜/시간
  • key id: 개인키 식별위한 64비트 값
  • public key: 공개키 부분
  • private key: 개인키 부분. 암호화됨
  • user id: 사용자 email.다른 이름을 키쌍에 연결시키거나, 동일 user id를 여러 번사용하기 위해 이 필드 이용.

공개 키 링에 포함되는 내용

  • timestamp: 생성된 날짜
  • key id: 공개키 식별위한 64비트 값
  • public key: 공개키
  • owner trust: 소유자에 대한 신뢰도, 사용자에 의해 지정
  • user id: 사용자 email
  • Key legitimacy: PGP에 의해서 계산됨
  • signature: 서명
  • signature trust: 서명에 대한 신뢰도, owner trust에서 복사됨

자신의 개인키를 얻으려면 개인키 링에 key id를 자신의 id로 입력하여 검색한다. 그러면 해당 id의 개인키와 공개키를 얻을 수 있다. 이를 이용해 메시지를 서명하면 된다. 암호화할 때 사용할 상대방 공개키는 상대방 id로 public key ring의 key id를 사용해서 검색할 수 있다. 물론 user id를 사용해서 email 주소로도 검색이 가능할 것이다. 획득한 상대방 public key를 이용해서 암호화 하면 된다.
아래 그림이 이런 내용을 추가하였다.

키관리

중요한 부분이다. private key ring은 자신이 관리하기에 키에 대한 보장이 된다고 한다. 그럼 public key ring에 저장된 key는 어떻게 보장해야 하나? 가장 확실한 것은 본인이 직접 키를 가져와서 등록하면 된다. 그러나 현실적으로 쉽지 않다. 그래서 원격에서 키를 배포 및 관리해야한다.
PGP에서는 신뢰망(Web of trust) 개념을 사용하여 키 관리하고 있다. 신뢰망은 네트워크 구성 형태로 된 키관리라고 보면 다른 형태로는 인증기관에 의한 인증은 계층적 구조 형태라고 볼 수 있다.
Private key ring은 자신 ID(key id)로 관리하고, 자신의 시스템에 IDEA를 이용하여 암호화하여 저장한다. Public key ring은 다른 사용자 ID(key id)로 관리한다. 이 부분이 공격에 취약하다. 가장 어려운 부분이 다른 사람의 공개키에 대한 인증이다. 신뢰할 수 있는 공개키 취득하는 방법은 직접 가져오는 것이 안전하지만 전화나 메시지로 신뢰하는 사용자나 인증기관을 통해서 획득하는 방법도 있다. 즉, 신뢰망은 신뢰하는 사용자들을 통해서 키를 관리하는 방식이다.
이는 다른 사람의 공개키를 자신이 서명하고 자신이 서명한 사용자의 공개키를 보증하는 형태이다. 그래서 public key ring에 요소 중에 signature가 있다. 그리고 내가 해당 사용자의 소유자 신뢰(owner trust)를 지정할 수 있다. 이를 통해서 사용자의 공개 키에 대한 신뢰도를 지정할 수 있다. 이는 서명과는 별개이다. 서명은 다른 사용자에서 이 사용자의 공개키를 보증하다는 의미일 뿐이다.
일반적으로 자신의 공개키와 다른 사용자의 공개키를 별도 파일로 관리하고, 자신의 개인키는 암호화하여 별도로 저장해서 관리한다. 그리고 공개키 생성위한 seed 값 저장용 파일도 별도로 관리한다.
실제로 이런 부분의 키 인증 사용 방법에 대해 사용자에게 이해시키는 것이 어렵다. 이로 인해 PGP 사용을 어렵게하는 요인이다. 이를 어떻게 풀어가는 것에 의해서 달라진다.
이런 신뢰망 구조에서는 별도 외부에서 인증하는 것이 아니라 자신이 인증에 핵심역활을 하는 것이다. 이로 인해 사용자 접근성이 가장 큰 이슈이다.
그렇기에 사용자에게 키와 신뢰도에 대한 정보 제공하는 인터페이스가 필요하며, 이 인터페이스에는 키 종류, 식별자(해당 키에 포함된 소유자 및 메일 주소), 소유자에 대한 신뢰도가 나타나야 한다. 물론 쉽게 이해하도록 표현해야 한다. ^^;
만약 내가 임의 사용자에 대해 신뢰할 수 있다고 하면 해당 공개 키에 대해 서명을 하고 이를 배포할 수 있다. 이런 서명은 키가 유효하다는 것과는 틀리다. 그리고 다른 사용자가 나를 신뢰하고 있다면, 내가 서명한 공개 키에 대해 유효하다고 판단해서 사용하게 된다. 물론 다른 사용자가 나에 대해 신뢰하는 부분은 위의 소유자 신뢰에 의해서 결정된다.

공개 키 기타

  • validity:
  • expires: 유효 기간
  • cipher: 암호 알고리즘
  • size: 키쌍 크기

신뢰망에서 Public key ring의 중요하게 사용하는 항목이 Key legitimacy, Signature trust, Owner trust이다.
Key legitimacy는 키가 해당 사용자에 유효한 지에 대한 신뢰도이다. 높을 수록 높은 신뢰도를 가지며 이 사용자 ID와 키 간에 관계가 확실하다는 말이다.
Signature trust는 사용자가 공개키 서명한 사용자에 대한 신뢰도이다. 이 신뢰도에서 파생된 엔트리에 대한 부분이 Key legitimacy이다.
Owner trust는 공개 키 소유자에 대한 신뢰도이다. 이 신뢰도에 대한 레벨은 다음과 같다.

구분 설명
I trust ultimately 완전히 신뢰
I trust fully 항상 신뢰
I trust marginally 부분적 신뢰
I do Not trust 신뢰하지 않음
Unknown 모름

자신의 키에대해서는 owner trust는 자동으로 ultimately로 할당된다. 그 외의 키는 항상 사용자에게 unknown, untrusted, marginally trusted, completely trusted로 할당할 수 있다.
PGP는 해당 공개 키링을 검색하여 signature의 서명자가 알고 있는 public key 소유자인지를 찾는다. 만약 있다면 이 사용자에 대한 owner trust를 이 signature에 대한 signature trust로 할당한다. 찾지 못했다면 unknown 사용자로 할당한다.
Key legitimacy는 signature trust의 존재에 따라서 결정된다. ultimate trust가 되었다면 complete로 설정되고, 그렇지 않다면 PGP는 신뢰도를 가중합으로 계산한다. 1/X는 항상 신뢰하는 signature에 주어지며, 1/Y는 보통의 신뢰하는 signature에 주어진다. X와 Y는 사용자가 설정한 값이다.
아래는 cryptonite에서 Key Ring 관리 UI이다.

출처: http://fengnet.com/book/Beautiful.Code.2007/080.usability_is_the_key.html

결론

지금까지 PGP에 대해 살펴보았다. 최근 보안 이슈가 많이 발생하면서 상대방에 대한 인증과 식별이 중요한 문제로 두각되고 있다. 그런 관점에서 OpenPGP는 완벽하지는 않지만, 적당한 노력으로 최대의 결과를 얻을 수 있다고 생각한다. PGP의 메시지 처리 방식과 공개키 관리 방식에 대한 부분은 다른 곳에서도 이용할 수 있을 정도로 아주 단순하기 때문에 활용하기도 쉽다고 생각한다. 공인 인증 서버를 활용한 키 배포가 아니라면 이를 사용한 간단한 키 관리와 메시지 처리가 유용하리라 본다.
마지막으로 다행이 국내에 PGP에 대한 내용을 잘 정리된 자료가 많아서 생각보다 쉽게 정리할 수 있었다. PGP 자료를 제공해주신 분들께 감사를 드린다.

참고

[1] netwk.hannam.ac.kr, chap 9. 전자우편 정보보호, http://netwk.hannam.ac.kr/data/computer\_sec/chap9.ppt
[2] Sawrie Brown, Cryptography and Netowrk Security 4th edition Chapter 15 by William Stallings, http://maggiulli.cs.unicam.it/Slides%20lezioni%20testo%20Stallings%202009/ch15%20-%20La%20sicurezza%20della%20posta%20elettronica.ppt

반응형