본문 바로가기

보안 이론/네트워크 보안

공개키 암호와 해시를 이용한 인증 원리

반응형

공개키 암호 알고리즘과 해시에 대해 이해하고 어떤 방식으로 인증을 보장하는지 알아보았다.


공개키 암호화 방식

공개키(public key)와 개인키(private key) 쌍을 이용해 암호화 하는 방식으로 비대칭키 암호화라고도 한다.

공개키는 모두에게 공유할 수 있고 개인키만을 혼자 안전하게 보관하고 사용한다.

대칭 키 암호 방식보다 계산이 복잡하여 속도가 떨어지기 때문에 큰 데이터 교환 시에는 보통 대칭키를 공개키 방식으로 암호화하여 교환 후 대칭 키 방식을 이용하여 통신한다.

 

Diffie-Hellman 키 교환 알고리즘

최초의 공개키 알고리즘으로 대칭키 키 교환 문제를 해결하였다.

이산 대수의 원리를 이용하여 서로의 공개키, 개인키로 같은 세션 키를 만들어낸다.

이산 로그는 계산은 쉬우나 역을 구하는 어렵다는 특징이 있기 때문에 키를 안전하게 생성할 수 있다.

데이터를 만들어낸 세션키로 암호화해서 보내면 상대도 복호화할 수 있다.

이 방식은 기밀성은 제공하나 상대가 누구인지 인증할 수 없어 중간자 공격에 취약할 수 있다.

 

RSA

결과를 이용해 두 수를 찾는 것이 어려운 소인수분해 문제를 이용하여 개인키와 공개키를 만든다.

  ex) 91 = 7 * 13      7*13이 91인 것을 연산하기 쉬우나 91에서 7과 13을 찾아내는 것은 쉽지 않음

양방향 암호화 : 하나의 키로 암호화하면 쌍이 되는 다른 키로만 복호화할 수 있다. 

  • 기밀성 : 수신자의 공개키로 암호화시 수신자만이 데이터를 확인할 수 있어 기밀성이 보장된다. 

 

  • 인증 : 송신자의 개인키로 암호화시 송신자의 공개키로만 복호화할 수 있어 송신자가 보낸 데이터임을 인증한다.

 

ECC(Elliptic Curve Cryptography, 타원 곡선 암호화)

이산 대수의 문제에 기반하여 안전성을 제공한다.

RSA 보다 짧은 키 길이로 강력한 암호화 제공하여 모바일 환경에서도 적합하다.

장점이 명확한 반면 구현이 어려워 적용이 많이 되지 않았다.

http://wiki.hash.kr/index.php/%ED%83%80%EC%9B%90%EA%B3%A1%EC%84%A0%EC%95%94%ED%98%B8

Hash 함수

데이터를 해시함수를 통해 일정한 길이의 해시값으로 출력시킨다.

  • 고정 길이 출력 : 원문이 어떤 크기를 갖더라도 결과는 항상 일정한 길이의 해시값으로 출력된다.
  • 일방향 함수 : 해시 함수와 해시 값을 알고 있더라도 원문을 복구할 수 없다.
  • 충돌 방지 : 원문이 다른데 해시값이 같을 경우는 매우 적다.
  • 무결성 검증 : 원문이 조금이라도 다를 경우 해시값이 많이 달라져 변조 여부를 확인할 수 있다

 

암호화와 Hash를 이용한 인증 방식

전자서명

생성 : 원문 전체를 해시한 값을 송신자의 개인키로 암호화한 뒤 원문과 함께 전송한다.

검증 : 원문을 직접 해시한 값서명된 해시를 송신자의 공개키로 복호화한 값일치 여부를 확인한다.

이를 통해 송신자 인증과 부인방지를 제공한다.

 

인증서

공개키 자체로는 신뢰할 수 없기 때문에 인증서를 통하여 검증한다.

웹 서버의 인증을 위해 인증기관(CA)의 개인키로 서명을 진행한다. 

느닷없이 CA가 누군데 서명을 해주고 믿으라는 걸까?

PKI ( 공개키 기반 구조 )

공개키를 인증하고 인증서를 신뢰할 수 있는 인프라를 만들기 위해 다음과 같이 구성되어있다.

  • 등록기관(RA) : 인증서 신청 업체를 검증하고 등록을 대행한다.
  • 인증기관(CA) :  인증서 발행하여 공개키의 신뢰를 제공한다.
  • 최상위 인증기관(Root CA) : (=PCA), 인증기관(CA)을 검증하며 OS에 인증서가 내장되어 있다.

웹서버는 CA의 인증을 받고 CA는 Root CA의 인증을 받으며 Root CA는 OS에 내장되어 있을만큼 이미 믿을만한 기관이므로 웹 서버가 정상적인 공개키를 갖고 있다고 확인하게 된다.

 

인증서는 웹 브라우저에서 자물쇠 모양으로 쉽게 확인할 수 있다.

 

SSL/TLS

웹 브라우저와 웹 서버간 암호화 통신을 하기 위한 프로토콜이다.

통신 채널의 암호화를 통해 메시지 전송의 안전을 보장한다.

데이터 암호화, 서버 인증, 메시지 무결성을 제공한다.

 

TLS HandShake

https://www.cloudflare.com/ko-kr/learning/ssl/what-happens-in-a-tls-handshake/

클라이언트와 서버가 연결되면 TLS 통신을 위한 몇 가지 절차를 거친다.

1. 클라이언트 헬로 : 클라이언트가 지원하는 TLS 버전, 지원 암호 방식, 클라이언트의 무작위 바이트 열을 제공

2. 서버 헬로 : 서버의 SSL 인증서, 선택한 암호 방식, 서버의 무작위 바이트 열을 전송

3. 인증 : 클라이언트가 서버의 SSL 인증서를 검증 후 공개키 획득

4. 키 교환 : 클라이언트와 서버의 무작위 바이트 열을 이용해 세션 키를 생성하고 서버의 공개키로 암호화하여 서버로 전송

5. 완료 : 서버가 개인키로 세션 키를 획득하고 정상적으로 대칭키 방식 통신이 준비됬음을 알림

 

로그인 과정

클라이언트가 서버에서 로그인을 진행할 때 다음과 같은 과정이 발생한다.

 

전자봉투

공개키와 대칭키, 해시를 이용하여 기밀성, 무결성, 인증을 모두 제공한다.

한 객체로 구성되어 연결된 세션에서의 통신이 아니더라도 안전을 보장한다.

복잡해 보이지만 순서는 다음과 같다.

1. 송신자는 메시지를 해시한 값을 송신자의 개인키로 서명한다.

2. 송신자의 공개키와 메시지, 서명된 해시값대칭키로 암호화한다.

3. 암호화의 사용된 대칭키수신자의 공개키로 암호화한다.

4. 대칭키로 암호화된 데이터와 암호화된 대칭키를 묶어서 수신자에게 전송한다. 

 


반응형


Calendar
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Visits
Today
Yesterday