✖

비밀번호의 안전성

비밀번호로 보호된 프로그램(암호를 건 압축 파일, 이메일 등)에 들어가려는 공격자는 비밀번호를 모르고도 목적을 이룰 방법이 몇 가지 있다. 어떤 방법은 지능과 재치와 지식이 꽤 필요하고, 어떤 방법은 운과 체력이 조금 필요하다. 먼저 공격자에게 어떤 방법이 있는지 정리해 보자.

남의 비밀번호를 뚫는 방법

  • 비밀번호를 아는 사람(예를 들어 이메일의 주인)을 찾아서 비밀번호를 알아낸다. 말로 구슬리거나 돈을 주거나 위협한다. 이 방법은 이 글에서 더 다루지 않겠다 :-).
  • 주인에게서 비밀번호를 슬그머니 알아낸다. 예를 들어 가짜 이메일을 보낸다. 전문 용어로는 피싱이라고 한다. 계정 주인에게 이메일을 보내 로그인 아이디와 비밀번호를 답장으로 보내 달라고 하는 방법이다. 메시지가 얼마나 믿을 만해 보이는지는 보내는 사람에게 달려 있다. 부탁만으로는 부족하고 그럴듯한 이야기를 덧붙여야 한다. 데이터베이스가 고장 났으니 모든 사용자는 아이디와 비밀번호를 다시 입력하라, 그러지 않으면 계정을 없애겠다는 식의 메시지를 흔히 볼 수 있다. 메시지가 정말 그럴듯해 보이면 성공률이 낮지 않다.
  • 사전 공격. 인터넷에서 가장 흔한 비밀번호 목록을 내려받아 모두 시험해 본다. 운이 좋아서 주인이 흔한 비밀번호를 쓴다면 정말 쉽게 알아낸다. 여기서 중요한 교훈이 나온다. 뜻이 있는 낱말을 비밀번호로 쓰지 말자. 예를 들어 eminem을 비밀번호로 쓰면 초보 해커도 몇 초 만에 뚫는다고 장담한다. 아마 가장 효과적인 방법일 것이다. 비밀번호 사전이 정말 크다면 많은 사용자의 비밀번호를 큰 수고 없이 알아낼 수 있다.
  • 무차별 대입 공격(brute force)은 가장 무식한 방법이다. 세상에 있을 수 있는 모든 비밀번호의 나열을 시험해 보는 것이다. 프로그램은 일정한 알고리즘에 따라 글자를 차례로 조합하면서 원하는 비밀번호를 맞혔는지 확인한다. 찾으면 비밀번호를 저장하고 끝낸다. 이 방법을 더 자세히 살펴보자.

무차별 대입 공격

이 방법을 쓰는 프로그램은 여러 낱말의 순열을 만들면서 비밀번호를 맞혔는지 시험해 볼 뿐이다. 이런 시험에 시간이 얼마나 걸리는지 계산해 보자.

영어 알파벳 소문자만으로 이루어진 다섯 글자 비밀번호가 있다고 하자. 영어 알파벳은 26글자이다. 이제 이런 글자 다섯 개로 서로 다른 비밀번호를 몇 개 만들 수 있는지 쉽게 계산할 수 있다. 순서가 중요하므로(비밀번호 strom과 morst는 같은 글자로 이루어졌지만 같지 않다) 순열을 쓰고, 비밀번호에서 글자가 되풀이될 수 있으므로 중복순열을 써야 한다. 이제 계산해 보자. 중복순열의 공식은 {}nΠk = nk이다. n에는 고를 수 있는 글자의 수, 즉 영어 알파벳의 글자 수를 넣고, k에는 비밀번호를 이루는 글자의 수, 즉 이 경우에는 5를 넣는다. 그러면 265, 즉 약 1,200만 가지의 서로 다른 나열이 나온다. 많은 것일까, 적은 것일까?

이는 어떤 컴퓨터를 쓰는지에도 달려 있다. 낡은 컴퓨터는 1초에 비교를 조금밖에 못 하지만, 최신 컴퓨터는 만 배쯤 더 할 수 있다. 이 글의 예에서는 컴퓨터가 1초에 비교와 판정을 1,000만 번 할 수 있다고 하자. 다섯 글자 비밀번호라면 이런 컴퓨터가 2초 안에 알아낸다는 것은 누구나 짐작할 것이다. 결코 좋은 결과가 아니다. 하지만 포기하지 말자.

비밀번호를 강하게 만들기

다섯 글자 비밀번호는 정말 조금도 안전하지 않다. 좀 더 똑똑한 시스템은 이렇게 짧은 비밀번호를 아예 쓰지 못하게 한다. 비밀번호는 여덟 글자보다 짧으면 안 된다고들 한다. 이제 여덟 글자 비밀번호의 나열이 몇 가지인지 계산해 보자. 앞에서처럼 영어 알파벳 소문자만 생각한다. 공식에 대입하면 268, 즉 약 2,000억 가지가 나온다. 이제 꽤 괜찮은 수이다. 컴퓨터는 모든 나열을 여섯 시간이 채 안 되어 확인한다. 앞보다 낫지만, 대문자, 숫자, 밑줄이나 하이픈 같은 특수 문자까지 쓰면 비밀번호의 강도가 얼마나 커지는지 보자.

소문자가 26개, 대문자도 26개로 모두 52글자이다. 여기에 숫자 10개와 특수 문자 몇 개를 더해야 한다. 모든 특수 문자를 어디서나 쓸 수 있는 것은 아니므로, 간단하게 특수 문자를 여덟 개만 생각해서 글자 수를 깔끔하게 70개로 맞추자. 비밀번호의 길이는 이번에도 8이다. 대입하면 708이 나오고, 감을 잡기 쉽게 쓰면 약 5.8 · 1014, 말로 하면 거의 600조 가지이다. 이제 꽤 대단한 수이다. 이 컴퓨터가 모든 나열을 확인하는 데 1만 6천 시간이 걸린다! 2년이 채 안 되는 시간이다. 공격자가 현실적인 시간 안에 비밀번호를 찾으려면 운이 아주 좋아야 한다. 게다가 비밀번호의 길이를 알아야 한다. 길이를 모르면 글자 수가 더 적은 나열도 확인해야 한다.

자기 데이터가 걱정된 나머지 숫자만으로 된 비밀번호를 쓰는 사람도 있다. 이런 비밀번호는 사전 공격에 아주 강하다. 자주 쓰는 비밀번호 사전에 하필 41,274,390,553이 들어 있기는 어렵기 때문이다. 하지만 이런 비밀번호는 사전 공격에는 강해도 무차별 대입 공격에는 약하다. 숫자는 열 개뿐이므로 나열의 수는 언제나 10k이다. 비밀번호의 강도는 길이로만 유지된다. 앞에서 모든 종류의 문자를 쓴 여덟 글자 비밀번호는 나열이 약 5.8 · 1014가지였다. 숫자 비밀번호로 적어도 그만큼 되려면 숫자가 열다섯 개, 즉 거의 두 배의 글자가 필요하다. 길이가 짧더라도 여러 종류의 문자를 쓰는 비밀번호가 더 효과적이라는 것이 분명하다.

공격자를 얕보지 말자

공격자는 똑똑할 수 있다. 앞의 내용을 읽고 지금 쓰는 비밀번호 “limonada”를 적어도 “Limonada”로 바꾸기로 했다고 하자. 공격자가 알고리즘에 대문자까지 넣어야 하므로 가능한 나열의 수가 몇 배로 늘어난다. 하지만 공격자는 대문자가 첫째 자리에만 있을 것이라고 짐작할 수 있다. 그래야 외우기 쉽고, 낱말 가운데에 대문자를 넣는 일은 드물기 때문이다. 그래서 소문자로 된 낱말과, 맨 앞에만 대문자가 하나 있는 낱말을 모두 시험하는 알고리즘을 짠다.

원래 비밀번호의 복잡도(비밀번호의 꼴, 즉 소문자 여덟 개를 그대로 둘 때 나열이 모두 몇 가지인지를 말한다)는 268이었다. 공격자가 아무 생각이 없다면 새 비밀번호의 복잡도는 528이지만, 앞에서 말한 알고리즘을 쓴다면 비밀번호의 복잡도는 52 · 267이다. 비밀번호의 첫째 자리에는 소문자와 대문자, 모두 52개가 올 수 있고, 나머지 일곱 자리에는 소문자만 올 수 있다. 이것은 보통의 중복순열이다.

또 공격자는 비밀번호가 글자 네 개와 숫자 네 개로 이루어지고, 섞이지 않고 숫자는 숫자끼리, 글자는 글자끼리 이어져 있다는 것을 알 수도 있다. 이런 비밀번호의 복잡도는 다음과 같이 구한다. 처음 글자 네 개는 나열이 264가지, 다음 숫자 네 개는 104가지이다. 이 두 결과를 곱하면 264 · 104이다. 숫자와 글자 가운데 무엇이 먼저인지 공격자가 모른다면 이 결과에 다시 2를 곱해야 한다.