[보안] 단방향 암호화 / 양방향 암호화란?

소프트웨어를 개발할 때, 외부 유출에 민감한 데이터를 다룬다면 좋든 싫든 데이터 암호화를 고려할 수 밖에 없다. 이 때 일반적으로 패스워드는 단방향 암호화 알고리즘을, 그 외의 개인을 식별할 수 있는 정보나 원본 데이터로 복구가 필요한 데이터는 양방향 암호화 알고리즘을 통해 암호화 한다.

암호화면 암호화지 또 뭔 단방향, 양방향으로 나뉜다는 것일까? 단방향, 양방향 이라는 단어에서 방향은 암호화/복호화를 의미한다. 즉 단방향은 암호화만 가능한 방식, 양방향은 암호화/복호화가 가능한 방식을 의미한다. 단방향 암호화와 양방향 암호화의 방식에 대해 흔히 알려진 특성들을 개략적으로 나열해 보자면 아래와 같다.

- 단방향 암호화 (일방향 암호화)

1. 복호화가 불가능하다.
2. 동일한 입력 값이 들어올 경우, 해시 값도 항상 동일하다.
3. 입력 값의 길이가 달라져도, 해시 값의 길이는 항상 동일하다.
4. 입력 값이 1bit 크기의 값만 바뀌더라도 해시 값이 크게 변화한다. (눈사태 효과)

- 양방향 암호화

1. 복호화가 가능하다.
2. 암호화/복호화 시, 키를 사용한다.

그렇다면 이제부터는 단방향 암호화와 양방향 암호화에 대해 각각 좀 더 깊이 있게 다루어보도록 하겠다.


단방향 암호화

기본적으로 단방향 암호화라는 것은, 암호화가 완료된 데이터를 통해 어떠한 방식으로든 원본 데이터로 복호화 할 수 없는 암호화 방식을 의미한다. 단방향 암호화 중 가장 대표적인 방식은 해시(Hash)다. 우리가 가장 흔히 쓰는 단방향 암호화 알고리즘인 SHA(Secure Hash Algorithm) 계열이 바로 해시 알고리즘이다.

출처: MD5 vs SHA-1 vs SHA-2 - Which is the Most Secure Encryption Hash and How to Check Them (freecodecamp.org)

일반적으로 단방향 암호화는 패스워드를 암호화 하거나, 파일에 대한 체크섬 값을 생성해 동일한 파일임을 보증할 때 사용된다. 즉, 원본 데이터 값이 동일하다는 것을 증명하는 무결성 확인을 위해 쓰인다.

그런데 복호화도 안되는 데이터를 가지고 어떻게 원본 값이 같다는 것을 증명할 수 있을까? 이는 단방향 암호화의 특성을 보면 알 수 있다. 위에서 나열한 단방향 암호화의 특성 중, 가장 중요한 것은 2번의 '동일한 입력 값이 들어올 경우, 해시 값도 항상 동일하다.'라는 특성이다. 이를 통해 입력 값을 알 수 없더라도, 동일한 해시 값이 나왔다는 결과를 통해 입력된 값이 동일 했다는 것을 증명할 수 있다.

예를 들어 어떤 유저가 회원가입을 했을 때 암호 "!Q@W3e4r"를 사용했고, 이를 SHA-256 알고리즘을 통해 해시 했다고 가정하자. 이에 대한 해시 값은 다음과 같다.

해시 값: 7F59507DB92F5EBD8EAF04EE08738922AD93761072C4F1923C8C87C7124719E0
해시 값은 원칙적으로 대소문자를 구별하지 않는다

이 해시 값은 데이터베이스에 유저 패스워드 정보로 저장될 것이다. 나중에 해당 유저가 로그인 했을 때도 마찬가지로 해시 값이 생성 될 것이고, 이 때 생성된 해시 값과 데이터베이스에 저장된 유저 패스워드와 비교하여 동일한 값인지 확인한다. 이 값이 동일하다면 시스템은 올바른 패스워드를 입력 했다고 판단하고 로그인 시킬 것이다.

체크섬의 경우에도 비슷하다. 파일을 만든 제작자는 해당 파일에 대한 해시 값을 미리 생성해 파일과 같이 배포한다. 만약 도중에 파일이 바꿔치기 되어도, 파일을 다운로드 받은 사람은 다운로드 받은 파일의 체크섬 값과 원본 체크섬 값을 비교해 해당 파일이 바꿔치기 되었는지 알아낼 수 있다.

하지만 단방향 암호화는 이런 특성 때문에 생기는 어쩔 수 없는 문제점들이 존재한다. 단방향 암호화에서 생기는 문제점은 다음과 같다.

- 해시 충돌(Hash Collision)

모든 해시 알고리즘은 해시 충돌(서로 다른 입력 값을 통해, 동일한 결과 값이 나오는 현상)의 가능성이 존재한다. 이는 비둘기집 원리를 통해 증명이 가능하다. 해시 알고리즘에서 결과 값의 동일함이 곧 입력 값의 동일함과 같은 말임을 생각 해보면 이는 치명적인 문제점이다. 따라서 해시 충돌 가능성이 낮을수록 좋은 해시 알고리즘이다.

- 레인보우 테이블 공격(Rainbow Table Attack)에 취약

레인보우 테이블이란 해시 알고리즘을 통해 생성한 수 많은 결과 값을 저장한 리스트를 의미한다. 단방향 암호화 특성을 이용한 공격 방식으로, 무차별 대입 공격에 앞서 효율적으로 유저의 계정을 탈취하기 위한 공격 방식이다. 이 리스트에는 항상 순위에 올라가는 최악의 패스워드(EX. 1234, password, !Q@W3e4r 같은 것들...)들의 해시 값이 저장되어 있을 가능성이 높다. 따라서, 이런 패스워드를 사용하고 있다면 레인보우 테이블 공격에 의해 계정이 탈취될 수 있다.

물론, 이런 단방향 암호화의 문제점을 보완하기 위한 기법도 존재한다. 대표적으로 소금치기(Salting), 후추치기(Peppering), 키 스트레칭(Key Stretching) 기법이 있다.

- 소금치기/후추치기

소금과 후추는 원본 데이터에 추가로 더해지는 데이터를 의미한다. 예를 들어 원본 데이터가 "!Q@W3e4r" 라고 가정하자. 여기에 추가적으로 "a"라는 데이터를 추가해 "!Q@W3e4ra"로 변경한다. 이 때, "a"라는 데이터는 소금 혹은 후추가 된다. 이렇게 소금과 후추 값을 사용하는 이유는, 추가적인 데이터가 붙음으로써 발생하는 눈사태 효과를 유도하는 것이다. 따라서 소금 및 후추 데이터가 추가된 데이터를 해시 할 경우, 원래 나왔을 해시 값 과는 완전히 다른 해시 값을 유도할 수 있다. 소금과 후추의 차이점은 소금은 해시 할 때마다 항상 랜덤한 값을 생성하는 것이고, 후추는 사용자에 의해 설정 된 고정된 값이라는 점이다. 물론 이 두가지는 공격자에게 노출되면 의미가 없어지므로 항상 주의해서 보관해야 한다.

- 키 스트레칭

키 스트레칭 기법은 한 번 해시한 값을 재차 해시하는 기법을 의미한다. 해시를 할 때마다 값이 바뀌게 되는 점을 이용해 원본 값이 무엇인지 알기 어렵게 하는 것이다. 소금/후추치기와 키 스트레칭 기법을 혼용해서 사용 할 수도 있다.

출처: 안전한 패스워드 저장 (naver.com)

위의 기법들은 단방향 암호화의 특성인 눈사태 효과를 적극적으로 사용해 공격자로 하여금 공격에 걸리는 시간이 늘어나도록 방해하는데 중점을 둔다. 그러나 이런 기법들은 해시 알고리즘 취약점에 대한 근본적인 해결책은 아니다. 따라서 취약점이 발견된 해시 알고리즘을 사용하는 것은 절대 금물이다.


양방향 암호화

양방향 암호화는 암호화 된 데이터를 복호화 해 원본 데이터를 확인할 수 있는 방식의 암호화를 의미한다. 단방향 암호화와 달리, '원본 데이터' 그 자체가 중요할 경우에 쓰이는 암호화 방식이다. 개인 정보 중에서는 계정 패스워드를 제외한 인적 정보 및 파일을 암호화 할 때 자주 사용된다. 양방향 암호화는 크게 대칭 키 암호화(Symmetric-key encryption) 방식과 비대칭 키 암호화(Asymmetric-key encryption) 방식으로 분류된다. 우선 대칭키 암호화 방식에 대해서 알아보도록 하자.

대칭 키 암호화

대칭 키 암호화 방식은 암호화/복호화 시 동일한 키를 이용하는 방식이다. 대칭 키 암호화 방식의 장점은 비대칭 키 암호화 방식에 비해, 암복호화 속도가 매우 빠르다. 이 장점으로 인해 용량이 큰 파일도 빠르게 암호화 하는 것이 가능하다. 반면 단점으로는 키가 탈취될 시, 공격에 매우 취약해진다는 점이다. 이는 암호화/복호화 시 동일한 키를 사용하기 때문에 생기는 문제다. 이 단점 때문에 대칭 키 암호화 방식은 키를 주고 받을 때, 키를 탈취하려는 공격에 대해 극도로 주의해야만 한다. 제 아무리 철통같이 암호화 된 데이터라 하더라도, 키가 탈취 당하면 암호화는 아무런 의미가 없다.

출처: Symmetric-key algorithm - Wikipedia

대칭 키 암호화 방식의 알고리즘 중, 가장 유명한 것은 DES(Data Encryption Standard)AES(Advanced Encryption Standard) 알고리즘이다. 다만 DES 알고리즘은 현재 취약한 암호화 알고리즘으로 분류되기 때문에 사용하지 않는 것이 좋다.

비대칭 키 암호화

비대칭 키 암호화는 문자 그대로 서로 다른 키 쌍을 이용해 암복호화 하는 암호화 방식이다. 이 키 쌍은 공개 키(Public Key)개인 키(Private Key)로 이루어져 있다. 공개 키는 일반적으로 서버 상에 공개되어, 누구나 이 공개 키를 이용하여 데이터를 암호화 할 수 있다. 이렇게 암호화 된 데이터는 개인 키를 통해서만 복호화가 가능하기 때문에, 데이터를 수신한 수신자만이 확인이 가능하다. 반대로 개인키를 이용해 암호화 된 데이터는 공개 키를 이용해서만 복호화가 가능하다.

출처: Public-key cryptography - Wikipedia

모든 사람에게 공개된 키로 복호화가 가능한 데이터를 굳이 개인 키로 암호화를 한다는 것에 대해 이상하게 여기는 사람들이 있을 것이다. 개인 키로 암호화 하고 공개 키로 복호화 하는 행위는 기밀성을 위해서 하는 것이 아닌, 강력한 인증/부인방지 수단으로 사용하기 위한 것이다. 공개 키를 이용해 정상적인 복호화가 가능하다면 이는 올바른 개인 키를 이용해 데이터를 암호화 했다는 의미이므로, 특정 유저가 정상적인 수단을 통해 암호화 했다는 인증의 수단으로 쓰인다. 이는 실제로 전자서명에 적용되는 원리이기도 하다.

출처: Public-key cryptography - Wikipedia

비대칭 키 암호화의 장점은 처음에 생성한 키 쌍에서 개인 키만 한번 전달하고 나면 키를 교환할 필요가 없기 때문에 키 탈취 공격에 대해 자유로운 편이라는 점이다. 또한 위에서 얘기했듯이 대칭 키 암호화와 달리 인증/부인방지 기능을 제공한다는 장점도 있다. 반면 단점으로는 암복호화 시, 속도가 매우 느리다는 문제가 존재한다. 이 때문에 보통 비대칭 키 암호화 방식은 대용량의 데이터를 처리하는데는 적합하지 않다. 따라서 비대칭 키 암호화는 일반적으로 메시지 암호화 및 인증에 사용하는 경우가 많다.

비대칭 키 암호화 알고리즘 중에서 가장 유명한 것은 RSA 알고리즘이다. 이 알고리즘의 이름은 알고리즘을 고안한 세 명의 성(Ron Rivest, Adi Shamir, Leonard Adleman) 맨 앞 글자를 딴 것이다. RSA 암호화 알고리즘은 큰 수를 소인수 분해 하기 어렵다는 점에 착안해 만든 암호화 방식이다. 이런 비대칭 키 암호화 방식의 특성은 전자상거래 매우 유용하게 사용되고 있는데, 특히 인터넷 상에서 전자서명을 통해 자신임을 증명하는 인증수단으로 유용하게 사용 되고 있다. (그리고 한국인들이 극혐하는 공인인증서가 바로 이 전자서명이다.)


정리하며

최근 암호화를 편리하게 할 수 있는 라이브러리를 개발하면서, 조사했던 암호화 방식이나 알고리즘을 여러모로 조사했다. 이렇게 조사하면서 이번 기회에 암호화 방식에 대한 특성이나 장단점에 대해 정리하여 공유하면 좋을 것 같아서 이 글을 쓰게 되었다. 다음에 기회가 된다면 이 글에서 다루지 않은 단방향 암호화인 MAC(Message Authentication Code)에 대해서도 다루어 보려고 한다.


참고한 문헌 및 블로그 글

  1. https://javaplant.tistory.com/26
  2. https://velog.io/@kdh10806/단방향-암호화-양방향-암호화