암호화 알고리즘의 종류

이원석·2024년 11월 21일
1

인증 및 인가

목록 보기
6/6

비대칭키/대칭키 전략을 수행하는 대표적인 암호화 알고리즘들에 대해 알아보자.

디피-할만(Diffie-Hellman)


[대칭키 방식]

1. HMAC(Hashed Message Authentication Code)

MAC 방식은 송/수신자간의 전달된 메시지를 비교하여 변조 여부를 검증하는 방식이다.

HMAC은 MAC방식에 해싱과 공유키를 활용한 기술이다. 원본 메시지가 변하면 그 해시값도 변하는 해싱(Hashing)의 특징을 활용하여 메시지의 변조 여부를 확인하여 무결성과 기밀성을 제공하는 기술이다.


1-1. Flow

송신자와 수신자 사이에 암호화 채널을 사용하여 해싱할 비밀키를 공유한다. (by 암호화 채널 HTTPS)

송신자는 비밀키를 사용하여 원본 메시지를 해싱한다. 이 때, 해싱 된 메시지가 바로 MAC이다. 송신자는 수신자에게 해싱 된 메시지(MAC)와 원본 메시지를 전달한다.

수신자는 공유한 비밀키로 원본 메시지를 해싱하고, 송신자에게 받은 MAC과 비교해본다. 만약, 메시지가 변조되었다면 송신자에게 받은 MAC과 결과값이 다르기 때문에 무결성을 검증할 수 있다.

근데, 누군가가 메시지를 변조하지 않고 몰래 엿볼 수 있는 원본 메시지를 보내는 것이 괜찮을까?
HMAC의 해싱 기술은 암호화가 아닌 무결성을 확인하는 신원 확인 기술에 사용이기 때문에 몰래 엿본다고 큰일나지는 않는다.

그래도 메시지가 변조되면 기분 나쁘지 않은가?

따라서 HTTPS 프로토콜 통신을 통해 원본 메시지를 보호(암호화 by Session Key)하고 MAC과 함께 전달하는 것이 일반적이다.


1-2. JWT 토큰에서의 HMAC

Header, Payload를 인코딩 한 문자열을 결합하여 서버의 비밀키로 해싱한 값을 Signature로 사용하며, 이는 추후에 클라이언트가 서버에게 요청시 신원 확인 및 위변조 용도로 사용된다. 이것은 서버에서 서명(Signautre)의 생성과 검증을 모두 비밀키로 하는 대칭키 방식이다.

즉, 인증(Authentication)이 주 목적인 JWT 토큰은 HMAC 방식을 사용한다.


1-3. Replay Attack

공격자는 메시지를 변조할 수 없으니, HMAC을 그대로 사용하여 수신자에게 불필요한 호출을 여러 번 보내는 공격이다.
인증 세션을 재사용하여 시스템에 무단 접근하거나 거래 사이트에서 결제 요청을 재전송하여 무료로 물품을 구매하는 등의 행위가 있다.

이는 요청에 고유한 난수를 포함시켜 중복된 요청을 차단하거나 TimeStamp를 활용하여 특정 시간 이후의 요청은 유효하지 않도록 만들어 방지할 수 있다.




2. GCM (Galois/Counter Mode)

GCM (Galois/Counter Mode)는 대칭키 블록 암호 모드 중 하나로, 암호화와 데이터 무결성/인증을 동시에 제공합니다. 이 방식은 카운터 모드(Counter Mode) 암호화갈로아 필드 곱셈(Galois multiplication) 을 이용한 인증 방식을 결합하여 인증된 암호화(AEAD)를 구현합니다. GCM은 TLS나 IPsec과 같은 프로토콜에서 사용됩니다.

특징

  • 암호화:
    카운터 모드로(대칭키) 암호화를 수행

  • 카운터 모드(CTR):
    각 블록을 암호화 할 때 "카운터" 값을 사용하여 동일한 데이터도 다른 암호문을 생선한다. 따라서 동일한 데이터를 여러 번 암호화 해도 같은 암호문이 생성되지 않아 "재전송 공격(Replay Attack)"을 방지할 수 있다.

  • 갈루아 곱셈(Galois Multiplication):
    데이터의 무결성을 확인하기 위해 사용된다. 이를 통해 암호화 된 데이터가 변조되지 않았는지 체크할 수 있는 인증 태그를 생성한다.

  • 요약:
    다음 암호화 방식과 달리 수행병렬처리에 적합하여 대량의 데이터를 훨씬 빠르고 효율적으로 처리한다. 또한, CTR 모드 덕분에 암호화와 인증을 한 번에 처리할 수 있다.

암호화 및 인증을 동시에 처리할 수 있다는 차별점이 있다.




[비대칭키 방식]

1. RSA(Rivest-Shamir-Adleman)

RSA는 아주 유명한 비대칭키(공개키) 암호화 알고리즘이다. 공개키와 개인키가 한 쌍을 이루며, 공개키로 암호화한 내용은 개인키로만, 개인키로 암호화한 내용은 공개키로만 해독할 수 있다.

  • 공개키(Public Key): 누구나 알아도 되는 키
  • 비밀키(Private Key): 소유자만 아는 키

따라서, 다음과 같이 암/복호화를 다른 키로 구성한다면 모두 비대칭키 방식이다.

  • 공개키 암호화 → 비밀키 복호화
  • 비밀키 암호화 → 공개키 복호화

1-1. Flow1 (공개키 암호화)

이미지 출처: https://ssdragon.tistory.com/87

  • 공개키는 누가나 알아도 되는 키이다. A는 B에게 데이터를 보낼 때, B의 공개키로 암호화하여 전송한다.
  • 데이터는 B의 공개키로 암호화 되었기 때문에 무조건 B의 비밀키로만 복호화가 가능하다.
  • 따라서, 해커는 암호화 된 정보나 B의 공개키를 탈취해도 정보를 알 수 없다! (대칭키 방식의 키 교환 문제 해결)
  • 다만, 해커가 데이터를 탈취하여 B의 공개키로 이상한 파일을 암호화하여 보낼 위험성이 존재한다.

1-2. Flow2 (비밀키 암호화)

이미지 출처: https://ssdragon.tistory.com/87

  • 비밀키는 소유자만 아는 키이다. A는 B에게 데이터를 보낼 때, A 자신의 비밀키로 암호화하여 전송한다.
  • 데이터는 A의 비밀키로 암호화 되었기 때문에 무조건 A의 공개키로만 복호화가 가능하다.
  • 따라서, 모든이가 A의 공개키를 알기 때문에 해커가 이를 탈취하여 데이터를 열어볼 수 있다.
  • 누구나 열 수 있기 때문에 보안의 위험성이 존재하지만, A가 보냈다는 것을 100% 신뢰할 수 있다. (A의 개인키로 암호화 했기 때문에 ㅋ)
  • 즉, 누가 보냈는지에 대해 확실히 알 수 있고 인증관련 기술의 기본이 된다. (전자서명, 공인인증체계)

1-3. Flow3 (공개키 and 비밀키 암호화)

RSA의 공개키 암호화 방식은 데이터 변조의 위험이 있고, 비밀키 암호화 방식은 공개키를 이용하여 데이터를 조회할 수 있는 위험이 있다.

1차적으로 수신자 B의 공개키를 통해 데이터를 암호화하고 2차적으로 A의 비밀키를 통해 암호화함으로서 해당 문제들을 해결할 수 있다.

이미지 출처: https://ssdragon.tistory.com/87

  • 암호화 된 데이터는 1차적으로 A의 비밀키로 암호화 되었있기 때문에 A의 공개키로 복호화 해야한다.
  • 따라서 A가 보냈음이 인증된다.
  • 2차적으로 B의 공개키로 암호화 되어있기 때문에 무조건 B의 비밀키로만 복호화 해야한다.
  • 즉, A가 보내는 정보는 A임을 인증함과 동시에 안전하게 B에게 전달할 수 있다!




2. DSA(Digital Signature Algorithm)

DSA는 HMAC과 비슷하게 신원 인증과 무결성 검증을 위해 사용된다. 하지만 차이점이 존재하는데,

  • RSA는 개인키로 전자 서명 값을 만들지 않고, 원본 메시지를 압축 함수로 압축한 후 압축 해시값을 암호화하여 전자서명 값을 만든다. 메시지 인증 시에는 메시지를 다시 압축 해시값으로 만들고, 복호화된 전자서명 값과 비교하여 인증할 수 있다.

  • DSA도 메시지의 압축 값을 암호화해서 전자서명을 만드는 것은 같지만 메시지 인증과정이 다르다. DSA 알고리즘은 전자서명만을 위한 알고리즘이므로 비교없이 바로 인증이 가능하다.

(1) 송신자는 메시지를 해싱:
송신자는 원본 메시지를 해시 함수로 해싱하여 고정된 길이의 해시값을 생성합니다.

(2) 송신자는 비밀키로 서명:
송신자는 해당 해시값을 자신의 비밀키로 서명하여 전송할 수 있는 서명 값(전자 서명)을 만듭니다.

(3) 송신자는 서명과 원본 메시지를 수신자에게 전달:
수신자는 메시지와 함께 서명을 받습니다. 서명은 송신자의 비밀키로 생성된 값입니다.

[원본 메시지 / 서명(해시값, by 비밀키)]


(4) 수신자는 메시지를 해싱:
수신자는 받은 메시지를 같은 해시 함수로 해싱하여, 송신자가 서명한 해시값을 재구성합니다.

(5) 수신자는 서명을 공개키로 검증:
수신자는 송신자의 공개키를 사용하여 서명을 검증합니다. 공개키로 서명된 해시값을 복호화하여 서명이 유효한지를 확인합니다. 이 때, 공개키를 통해 서명된 값이 송신자의 비밀키로 생성된 것임을 검증합니다.

(6) 수신자는 두 해시값을 비교:
수신자가 해싱한 값과, 공개키로 복호화한 값이 일치하는지 비교합니다. 일치하면, 메시지가 위조되지 않았고 송신자에게서 온 것임을 확인할 수 있습니다.




서명, 암호화, 인증

4-1. 서명(Signing):

  • 목적: 서명은 메시지의 출처와 무결성을 보증하는데 사용된다.
  • 과정: 서명은 일반적으로 해시값(메시지 기반)을 비밀키로 암호화하여 생성됩니다. 이는 메시지에 대한 디지털 서명을 생성하는 과정으로, 서명된 메시지를 받은 사람이 공개키로 서명을 확인함으로써 메시지가 변조되지 않았고 송신자로부터 온 것임을 확인할 수 있습니다.
  • 복호화: 수신자는 송신자의 공개키를 사용해 서명을 검증하고, 서명이 유효하면 메시지의 무결성이 보장됩니다.

서명은 인증을 위한 하나의 수단에 불과하다!


4-2. 암호화(Encryption):

  • 목적: 암호화는 데이터나 메시지를 비밀로 보호하는데 사용됩니다. 암호화된 메시지는 다른 사람이 그 내용을 알 수 없도록 만든다.
  • 과정: 암호화는 메시지나 데이터를 비밀키나 공개키를 사용해 변환하는 과정이다. 공개키로 암호화된 메시지는 비밀키로만 복호화할 수 있고, 반대로 비밀키로 암호화된 메시지는 공개키로만 복호화할 수 있다.
  • 복호화: 암호화된 데이터를 복호화할 수 있는 유일한 키는 해당 키의 "쌍"으로 존재하는 키이다.

비대칭키 방식은 암/복호화, 서명 두 가지 목적을 가지고있다.
비밀키로 암호화 된 메시지를 공개키로 복호화 하는 과정은 서명(신원 인증, 누가 보냈는가 확인 가능 왜 why? 송신자의 비밀키로 암호화 되었기 때문)의 방식이며, 공개키로 암호화 된 메시지를 개인키로 복호화 하는 것은 암호화의 방식으로 볼 수 있다.

대칭키(비밀키 공유) 방식은 암/복호화(HTTPS의 세션키 기반), 인증 및 무결성 검증(HMAC)에 주로 사용되며 속도가 빠르고 효율적이기 때문에 데이터 암호화에 특히 많이 사용된다. 하지만 대칭키 방식은 키 교환(공유)에 대한 보안 문제가 발생하기 때문에 Diffie-Hellman(디피-헬먼) or RSA 방식을 통해 안전한 키 교환을 보장해야 한다.




정리

  • HMAC:
    서로 공유된 대칭키(비밀키) 방식의 해시 기반 메시지 인증 코드로, 메시지의 무결성과 인증을 확인.

  • RSA:
    암호화와 서명 모든 방식에 사용될 수 있다. 암호화 방식(공개키 암호화), 서명(비밀키 암호화)

  • DSA:
    오직 디지털 서명 생성과 검증에만 사용된다.





참고문헌
https://ssdragon.tistory.com/87
https://wan-blog.tistory.com/24
https://brunch.co.kr/@sangjinkang/53

0개의 댓글