학교에서 아이들과 컴퓨터 수업을 하면서 겪는 어려움 중 한 가지는 아이들이 비밀번호를 잘 기억하지 못한다는 점입니다. 그런데 이는 비단 아이들만의 문제는 아닙니다. 누구나 한 번쯤은 아이디나 비밀번호가 무엇인지 몰라 아이디/비밀번호 찾기를 해본 적이 있을 것입니다. 이 서비스에 가입을 했는지 안 했는지 조차도 기억하지 못하는 경우도 종종 있습니다.

당연한 이야기이지만 이 비밀번호는 매우 중요합니다. 비밀번호를 제대로 관리하지 않아서 매우 민감한 개인정보가 인터넷 공간으로 유출되거나 유출된 계정을 통해 대량의 스팸 메시지를 보내 억울하게 경고를 받거나 계정이 삭제되는 경우도 생깁니다. 따라서 온라인 계정의 비밀번호를 잘 관리하는 것은 21세기를 살아가는 사람들에게는 필수 역량이라 생각됩니다.

이 글에서는 비밀번호를 길고 복잡하게 설정하라고 하는 이유가 무엇인지와 비밀번호 유출 피해를 최소화 할 수 있는 방법에 대해서 알아보도록 하겠습니다.

비밀번호의 원리

비밀번호는 '내가 계정의 주인이라는 것'을 증명하기 위한 일종의 열쇠 역할을 합니다. 그런데 온라인 서비스의 종류에 따라 비밀번호를 설정할 때 요구하는 방식이 다양합니다. 자릿수 제한과 더불어 대문자, 소문자, 특수문자 등을 요구하기도 하는데 도대체 왜 그렇게 길고 복잡한 비밀번호를 요구하는 것일까요?

비밀번호는 중요하고 민감한 정보이기 때문에 당연히 암호화를 해서 저장합니다. 그런데 비밀번호는 일반적인 문서의 암호화와는 다르게 복호화를 염두에 두지 않습니다. 쉽게 설명하면 원래의 비밀번호가 무엇인지 알 수 있는 형태로 저장하지 않는다는 의미입니다.

그래서 비밀번호를 저장할 때에는 단방향 해시 함수(One-way Hash Function)를 사용합니다. 함수라는 것은 수학시간에 배웠듯이 어떤 값 a를 넣으면 a'가 나오는 상자라고 생각하면 됩니다. 이 단방향 해시 함수는 어떤 값 a를 알 때 a'는 쉽게 구할 수 있지만 a'를 안 다고 해서 a를 찾기는 매우 힘들기 때문에 단뱡향이라는 이름이 붙었습니다.

hashing-algorithm
(이미지 출처: stackoverflow)

해시 함수에서 a'의 값으로 a를 찾기 힘든 이유는 큰 숫자를 소인수분해하는 것은 어렵고 시간이 많이 든다는 수학적 원리를 이용했기 때문입니다. 77을 소인수 분해하면 어떻게 될까요? 7 X 11로 나타낼 수 있습니다. 그렇게 어렵지 않죠. 9735는 어떨까요? 9+7+3+5=24로 3의 배수이기 때문에 3으로 나누어 떨어지고 그 몫인 3245는 다시 5로 나누어 떨어집니다. 649는 11과 59로 나누어 떨어지는데요, 사람이 생각하기에는 다소 시간이 걸리지만 컴퓨터로 계산하면 눈 깜짝할 사이에 답을 찾을 수 있습니다.

하지만
-----2018-01-01-01.59.15
라는 숫자를 소인수 분해하면 어떻게 될까요?

-----2018-01-01-02.00.30
이 되는데 1993년 8월부터 1600대의 컴퓨터를 사용하여 8개월 뒤인 1994년 4월 26일에 소인수 분해를 완료하였다고 합니다. 소인수 분해 한 두 수를 곱하는 것은 매우 쉽지만 곱셈의 결과값을 가지고 두 수를 찾는 것은 쉽지 않습니다. 왜 단방향인지 이제 좀 이해가 되셨나요?

그래서 웹서비스들이 비밀번호를 저장할 때는 비밀번호 원문 대신 이 함수를 거친 결과 값을 저장합니다.(실제로는 조금 더 복잡한 과정을 거칩니다.) 예로 SHA-256이라는 해시 함수는 password라는 문자열을 다음과 같이 변환시킵니다. (이 사이트에서 직접 다양한 문자열을 변환시켜 볼 수 있습니다.)

5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8

위에서 설명한 것처럼 이 문구를 가지고 원래 입력한 값이 password라는 것을 아는 것은 매우 어렵습니다. 이렇게 해싱된 비밀번호는 일반인이 보기에는 안전해 보이지만 실제로는 결코 안전하지 않습니다. 바로 무차별 대입 공격(Brute Force Attack)이나 사전 파일을 이용한 공격(Dictionary Attack)이 가능하기 때문입니다.

무차별 대입 공격과 사전 공격은 쉽게 이야기해서 비밀번호에 a~z, 0~9, 특수문자 등 가능한 모든 조합을 차례대로 무식하게 대입해보는 공격입니다. 그런데 비밀번호의 자릿수가 매우 작거나(예를 들면 1234와 같은 경우) 유추하기 쉬운 단어가 포함된 비밀번호(예를 들면 password, hello 등)는 매우 짧은 시간에 원래의 비밀번호를 찾아낼 수 있습니다.

사전 공격은 무차별 대입 공격의 성공 확률을 높이기 위해서 무작위로 대입할 문자열에 보통 사람들이 비밀번호로 많이 사용하는 단어나 개인 신상 정보 등을 활용합니다. 비밀번호를 설정할 때 자신의 생일이나 전화번호, 차량번호, 집 주소 등 그 사람의 신상 정보를 알고 있을 때 유추하기 쉬운 비밀번호를 입력해서는 안 되는 이유가 바로 이 때문입니다.

레인보우 테이블이라는 방법도 있습니다. 레인보우 테이블은 해시 함수에 a라는 문자열을 입력했을 때 항상 같은 결과값이 나오기 때문에 해싱 전의 값과 해싱 후의 값을 많이 모아놓은 일종의 표라고 생각하시면 됩니다. 이 표를 보면 굳이 무차별 대입을 하지 않더라도 해싱 후의 문자열을 비교해서 원래 비밀번호가 무엇인지 알아내는 것이 가능합니다. 영국 텔레그래프 인터넷판에 올라온 세계에서 가장 많이 사용되는 패스워드라는 글을 보면 사람들이 많이 사용하는 비밀번호 1위가 바로 123456입니다. 123456 같은 경우에는 그냥 무차별 대입 공격을 해도 빨리 찾아낼 수 있는 비밀번호이기도 하지만 레인보우 테이블을 이용해 더 빨리 찾아낼 수 있죠. 그러니 1q2w3e4r 같은 비밀번호는 사용하지 않는 것이 좋습니다.

이 때문에 해커의 공격으로 인해 내가 이용하는 서비스의 비밀번호가 유출되었더라도 무차별 대입 공격 등으로 비밀번호가 무엇인지 알아내기 어렵게 하기 위해서 비밀번호는 최대한 길고 복잡하며 유추하게 어렵게 만들라고 요구했던 것입니다.

하지만 비밀번호가 길고 복잡하다고 해서 무조건 안전하다고 볼 수도 없습니다. 키보드에서 입력하는 모든 것을 기록하는 키로거(Key Logger)와 같은 악성코드에 감염된 경우나 웹사이트에서 암호화 되지 않은 상태로 로그인 정보를 주고 받는 경우 누군가가 아이디와 비밀번호를 훔쳐볼 수도 있습니다. 또 카페나 공공장소에서 쉽게 접할 수 있는 무선 AP에 접속할 때도 악의적인 사용자가 있다면 경우에 따라 비밀번호는 유출될 수 있습니다.

그래서 비밀번호는 항상 유출될 수도 있다고 가정해야하고 비밀번호가 유출되었을 때 추가적인 피해를 막기 위해서는 모든 사이트의 비밀번호는 다르게 설정하는 것이 좋습니다. 하지만 현실적으로 모든 비밀번호를 다르게 설정해 놓고 그것을 기억하는 것은 어렵기 때문이 비밀번호를 관리해주는 프로그램을 사용하는 것도 좋은 방법입니다.

비밀번호 관리 프로그램과 2단계 인증 사용하기

저는 1password라는 비밀번호 관리 프로그램을 이용해 모든 사이트의 아이디와 비밀번호를 관리하고 있습니다. 1password는 사이트 로그인 정보 뿐만 아니라 노트나 일반 파일 등도 암호화하여 저장할 수 있어 급여, 보험, 의료 등 민감한 개인정보가 포함된 파일들을 이곳에 함께 보관하고 있습니다.

비밀번호 관리 프로그램을 사용하면 모든 사이트의 비밀번호를 기억할 필요가 없습니다. 비밀번호는 프로그램에 저장되기 때문에 사이트의 비밀번호를 모두 다르게 설정할 수 있고 프로그램이 알아서 복잡하고 랜덤한 비밀번호를 추천해 주기 때문에 무차별 대입 공격에 대한 걱정도 줄일 수 있습니다.

1password와 비슷한 서비스로 LastPassEnpass 등이 있습니다.

비밀번호 관리 프로그램을 사용하는 것 외에 비밀번호 유출로 인한 피해를 최소화 할 수 있는 방법은 바로 2단계 인증을 사용하는 것입니다. 2단계 인증은 로그인을 할 때 아이디/비밀번호와 함께 휴대폰 본인 인증이나 인터넷 뱅킹의 OTP를 사용하는 것처럼 별도의 앱을 통해서 본인 인증 단계를 한 번 더 거치는 방식을 말합니다. 어떠한 경우로 비밀번호가 유출되었더라도 2단계 인증이 되어 있다면 본인이 미리 설정한 기기에서만 OTP 번호를 확인할 수 있기 때문에 악의적인 사용자가 내 계정에 접근하는 것을 방지할 수 있습니다.

요즘 대부분의 서비스가 2단계 인증을 지원합니다. 특히 이메일 서비스는 비밀번호 찾기 등을 통해 다른 웹사이트의 비밀번호를 재설정 할 수도 있기 때문에 주로 사용하는 이메일이나 개인 정보가 많이 포함되어 있는 클라우드 서비스 등에는 반드시 2단계 인증을 설정하는 것이 좋습니다.

주요 서비스의 2단계 설정에 관한 안내 페이지는 다음과 같습니다.

참고