비대칭키/대칭키 전략을 수행하는 대표적인 암호화 알고리즘들에 대해 알아보자.
디피-할만(Diffie-Hellman)
MAC 방식은 송/수신자간의 전달된 메시지를 비교하여 변조 여부를 검증하는 방식이다.
HMAC은 MAC방식에 해싱과 공유키를 활용한 기술이다. 원본 메시지가 변하면 그 해시값도 변하는 해싱(Hashing)의 특징을 활용하여 메시지의 변조 여부를 확인하여 무결성과 기밀성을 제공하는 기술이다.
송신자와 수신자 사이에 암호화 채널을 사용하여 해싱할 비밀키를 공유한다. (by 암호화 채널 HTTPS)
송신자는 비밀키를 사용하여 원본 메시지를 해싱한다. 이 때, 해싱 된 메시지가 바로 MAC이다. 송신자는 수신자에게 해싱 된 메시지(MAC)와 원본 메시지를 전달한다.
수신자는 공유한 비밀키로 원본 메시지를 해싱하고, 송신자에게 받은 MAC과 비교해본다. 만약, 메시지가 변조되었다면 송신자에게 받은 MAC과 결과값이 다르기 때문에 무결성을 검증할 수 있다.
근데, 누군가가 메시지를 변조하지 않고 몰래 엿볼 수 있는 원본 메시지를 보내는 것이 괜찮을까?
HMAC의 해싱 기술은 암호화가 아닌 무결성을 확인하는 신원 확인 기술에 사용이기 때문에 몰래 엿본다고 큰일나지는 않는다.
그래도 메시지가 변조되면 기분 나쁘지 않은가?
따라서 HTTPS 프로토콜 통신을 통해 원본 메시지를 보호(암호화 by Session Key)하고 MAC과 함께 전달하는 것이 일반적이다.
Header, Payload를 인코딩 한 문자열을 결합하여 서버의 비밀키로 해싱한 값을 Signature로 사용하며, 이는 추후에 클라이언트가 서버에게 요청시 신원 확인 및 위변조 용도로 사용된다. 이것은 서버에서 서명(Signautre)의 생성과 검증을 모두 비밀키로 하는 대칭키 방식이다.
즉, 인증(Authentication)이 주 목적인 JWT 토큰은 HMAC 방식을 사용한다.
공격자는 메시지를 변조할 수 없으니, HMAC을 그대로 사용하여 수신자에게 불필요한 호출을 여러 번 보내는 공격이다.
인증 세션을 재사용하여 시스템에 무단 접근하거나 거래 사이트에서 결제 요청을 재전송하여 무료로 물품을 구매하는 등의 행위가 있다.
이는 요청에 고유한 난수를 포함시켜 중복된 요청을 차단하거나 TimeStamp를 활용하여 특정 시간 이후의 요청은 유효하지 않도록 만들어 방지할 수 있다.
GCM (Galois/Counter Mode)는 대칭키 블록 암호 모드 중 하나로, 암호화와 데이터 무결성/인증을 동시에 제공합니다. 이 방식은 카운터 모드(Counter Mode) 암호화와 갈로아 필드 곱셈(Galois multiplication) 을 이용한 인증 방식을 결합하여 인증된 암호화(AEAD)를 구현합니다. GCM은 TLS나 IPsec과 같은 프로토콜에서 사용됩니다.
암호화:
카운터 모드로(대칭키) 암호화를 수행
카운터 모드(CTR):
각 블록을 암호화 할 때 "카운터" 값을 사용하여 동일한 데이터도 다른 암호문을 생선한다. 따라서 동일한 데이터를 여러 번 암호화 해도 같은 암호문이 생성되지 않아 "재전송 공격(Replay Attack)"을 방지할 수 있다.
갈루아 곱셈(Galois Multiplication):
데이터의 무결성을 확인하기 위해 사용된다. 이를 통해 암호화 된 데이터가 변조되지 않았는지 체크할 수 있는 인증 태그를 생성한다.
암호화 및 인증을 동시에 처리할 수 있다는 차별점이 있다.
RSA는 아주 유명한 비대칭키(공개키) 암호화 알고리즘이다. 공개키와 개인키가 한 쌍을 이루며, 공개키로 암호화한 내용은 개인키로만, 개인키로 암호화한 내용은 공개키로만 해독할 수 있다.
따라서, 다음과 같이 암/복호화를 다른 키로 구성한다면 모두 비대칭키 방식이다.
이미지 출처: https://ssdragon.tistory.com/87
이미지 출처: https://ssdragon.tistory.com/87
RSA의 공개키 암호화 방식은 데이터 변조의 위험이 있고, 비밀키 암호화 방식은 공개키를 이용하여 데이터를 조회할 수 있는 위험이 있다.
1차적으로 수신자 B의 공개키를 통해 데이터를 암호화하고 2차적으로 A의 비밀키를 통해 암호화함으로서 해당 문제들을 해결할 수 있다.
이미지 출처: https://ssdragon.tistory.com/87
DSA는 HMAC과 비슷하게 신원 인증과 무결성 검증을 위해 사용된다. 하지만 차이점이 존재하는데,
RSA는 개인키로 전자 서명 값을 만들지 않고, 원본 메시지를 압축 함수로 압축한 후 압축 해시값을 암호화하여 전자서명 값을 만든다. 메시지 인증 시에는 메시지를 다시 압축 해시값으로 만들고, 복호화된 전자서명 값과 비교하여 인증할 수 있다.
DSA도 메시지의 압축 값을 암호화해서 전자서명을 만드는 것은 같지만 메시지 인증과정이 다르다. DSA 알고리즘은 전자서명만을 위한 알고리즘이므로 비교없이 바로 인증이 가능하다.
(1) 송신자는 메시지를 해싱:
송신자는 원본 메시지를 해시 함수로 해싱하여 고정된 길이의 해시값을 생성합니다.
(2) 송신자는 비밀키로 서명:
송신자는 해당 해시값을 자신의 비밀키로 서명하여 전송할 수 있는 서명 값(전자 서명)을 만듭니다.
(3) 송신자는 서명과 원본 메시지를 수신자에게 전달:
수신자는 메시지와 함께 서명을 받습니다. 서명은 송신자의 비밀키로 생성된 값입니다.
[원본 메시지 / 서명(해시값, by 비밀키)]
(4) 수신자는 메시지를 해싱:
수신자는 받은 메시지를 같은 해시 함수로 해싱하여, 송신자가 서명한 해시값을 재구성합니다.
(5) 수신자는 서명을 공개키로 검증:
수신자는 송신자의 공개키를 사용하여 서명을 검증합니다. 공개키로 서명된 해시값을 복호화하여 서명이 유효한지를 확인합니다. 이 때, 공개키를 통해 서명된 값이 송신자의 비밀키로 생성된 것임을 검증합니다.
(6) 수신자는 두 해시값을 비교:
수신자가 해싱한 값과, 공개키로 복호화한 값이 일치하는지 비교합니다. 일치하면, 메시지가 위조되지 않았고 송신자에게서 온 것임을 확인할 수 있습니다.
서명은 인증을 위한 하나의 수단에 불과하다!
비대칭키 방식은 암/복호화, 서명 두 가지 목적을 가지고있다.
비밀키로 암호화 된 메시지를 공개키로 복호화 하는 과정은 서명(신원 인증, 누가 보냈는가 확인 가능 왜 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