오성국 블로그 이것저것 끄적끄적

키페어? Key 와 암호에 대한 정리

EC2 인스턴스를 생성하는 과정에서 다음과 같은 창을 보게 되었다.

키페어

암호화 키에 대한 개념이 아직 정확하게 잡히지 않아서 매번 키를 발급받고 관리를 못해서 못쓰게 되는 경우가 많았고 키가 어떻게 동작하는지 정확하게 모른체 동작만 되고 이해를 건너뛰다보니 이제는 한번 정리를 해야겠다 생각이 들었다.

암호의 아주 기본적인 개념

2가지가 있다. 암호화, 복호화

암호화는 자신이 가지고 있는 데이터(평문)을 암호문으로 바꾸는 것이고 복호화는 거꾸로 암호문을 데이터(평문)으로 바꾸는 과정을 말한다.

암호화와 복호화의 과정을 모두 가지고 있다면 양방향 알고리즘으로 주로 key 방식의 암호화이다. 복호화를 염두해 두지 않고 암호화의 과정만 있는 경우는 단방향 알고리즘으로 해쉬 암호화 방식이 대표적이다.

두가지의 알고리즘을 차근차근 알아보자

양방향 알고리즘

주로 데이터를 주고 받을 때 특정한 대상에 대해서만 열람을 허가하기 위해서 주로 사용한다. 예를 들어 어떠한 회사 임원이 기업의 기밀정보를 누군가에게 전송해야 할 때 그냥 보내기는 껄끄러운 느낌이들어 어떠한 Key를 가지고 암호화를 한 다음 키를 배송하여 열람할 수 있도록 한다.

위와 같은 암호화 방식이 대칭키(비공개키) 방식의 암호화이다. 다음과 같은 특징을 가진다.

  • 암호화와 복호화에 동일한 키를 이용한다
  • 속도가 빠르다
  • 사용자의 수만큼 키의 갯수도 증가한다
  • DES, AES 등

그런데 아주 큰 리스크가 존재한다. 누군가 기밀정보를 노리고 Key 를 가로챈다면 정보가 그대로 노출 될 수 있다. 즉, 암호화된 데이터를 전송하는것과 복호화하는 키를 전송함에 있어서도 기밀성을 유지해야한다는 문제가 발생한다.

기밀성을 유지하기위한 자원이 넉넉한 소수에게는 큰 문제가 되지 않지만 인터넷상처럼 수많은 사용자에 대해 암호 서비스를 유지하기 위해선 키 전송의 위험 부담과 사용자만큼 늘어나는 키의 관리도 어려워 진다.

이러한 문제를 해결하기위해 탄생한 양방향 알고리즘의 또다른 방법이 비대칭키(공개키) 방식의 암호화이다. 특징은 다음과 같다

  • 암복호화에 사용되는 키가 서로 다르다
  • 두개의 키에서 하나는 개인키 나머지는 공개키로 사용한다
  • 속도가 느리다
  • 공개키 하나와 각각의 사용자들의 개인키 하나씩만 가지고 있으면 된다
  • 전자 서명에서 사용된다

공개키로 평문을 암호화하고 상대방에게 전달해주면 전달받은 사람은 자신의 개인키로 복호화를 해서 열람을 할 수 있다. 암호화된 데이터를 가로채고 공개키를 받는다고 해도 공개키로는 복호화가 불가능 하므로 상대적으로 키 탈취에 대한 리스크를 줄일 수 있다. 공개키 암호화 방식도 중간자 공격(Man In The Middle Attack)으로 공개키와 개인키를 가져간다면 기밀을 도난당하는건 매한가지 완벽한 보안은 없다

단방향 알고리즘

단방향 알고리즘은 애시당초 복호화를 염두해두고 있지 않기 때문에 해시 함수를 통해 암호화를 진행한다. 주로 비밀번호를 데이터베이스에 저장할 때 단방향 알고리즘을 통해 암호화를 한뒤 저장한다.

2000년대만 하더라도 ‘비밀번호 찾기’ 라는 기능이 비일비재 했다. 그러다 개인정보에 대한 인식이 높아짐에 따라 ‘비밀번호 찾기’는 없어지고 ‘비밀번호 변경’으로 바뀌었다. 이는 비밀번호를 암호화 해서 저장을하면 관리자도 비밀번호를 절대 알 수 없다. 사용자가 비밀번호를 입력해서 암호화를 거친다음 데이터베이스의 암호화된 데이터와 비교하여 일치하면 같은 비밀번호로 인식, 이후 로그인을 진행하는 형식이다.

이러한 암호화도 위에서 언급한 바와 같이 완벽한 암호화는 아니다. 비밀번호가 단순하거나 사람들이 많이 사용하는 비밀번호의 경우에는 나쁜사람들이 레인보우 테이블이라는 각각의 비밀번호에 대한 해쉬값을 테이블로 만들어둬서 바로바로 털어버린다. 이러한 문제 때문에 비밀번호 그대로 암호화하는 것이 아니라 소금을 쳐서 저장하는 방식(Salt)을 사용하여 대비를 하곤 한다.

비밀번호를 길게, 그리고 다양한 문자 기호와 조합을 사용할 수록 비밀번호의 해쉬값을 찾는 시간이 기하급수적으로 증가하기때문에 비밀번호 설정시에 비밀번호 길이, 특수문자 포함 과 같은 번거로운 데이터 폼을 요청하는 것이니 데이터를 안전하게 지키고픈 개발자의 마음을 이해해주길 바란다.

이렇게 암호화 알고리즘에 대해 간단하게 정리해 보았다. 시간이 지날 수록 개인정보와 중요도가 높아지는 만큼 암호화에 대해 조금은 알고있는것도 나쁘진 않아 보인다.