🕵️ 친구와 암호 대화
한국어

강한 비밀번호와 암호문을 만드는 법

"비밀번호는 대문자, 숫자, 특수문자를 섞어서 8자 이상"이라는 규칙을 한 번쯤 보셨을 것입니다. 그런데 이런 규칙을 지킨 P@ssw0rd! 같은 비밀번호는 사실 매우 약합니다. 반면 별다른 기호가 없는 긴 문장이 훨씬 강한 경우도 많습니다. 이 글에서는 강한 비밀번호란 무엇인지, 길이와 무작위성이 왜 핵심인지, 그리고 외우기 쉬우면서 강한 문장형 암호문을 만드는 방법을 소개합니다.

비밀번호는 어떻게 뚫릴까

공격자가 비밀번호를 알아내는 방법은 크게 둘입니다. 하나는 정답을 하나씩 시도하는 추측이고, 다른 하나는 사용자를 속이거나 다른 곳에서 새어 나간 것을 재사용하는 방법입니다. 추측은 다시 두 가지로 나뉩니다. 로그인 창에 직접 입력해 보는 온라인 공격은 서비스가 시도 횟수를 제한하면 매우 느려집니다. 반면 서버에서 유출된 해시나 암호화된 파일을 손에 넣고 자기 컴퓨터에서 마음껏 대입하는 오프라인 공격은 제한이 없어서 초당 수십억 번도 가능합니다. 이때 방어선은 오직 비밀번호 자체의 강도와, 저장 방식이 얼마나 느리게 설계되었는지뿐입니다.

추측이라고 해서 무작위로 찍는 것은 아닙니다. 공격자는 유출된 비밀번호 목록, 흔한 단어, 이름과 생일, 그리고 "첫 글자만 대문자, 끝에 숫자 1과 느낌표"처럼 사람들이 자주 쓰는 변형 규칙부터 시도합니다. P@ssw0rd!가 약한 이유가 여기에 있습니다. a를 @로, o를 0으로 바꾸는 변형은 이미 너무 유명해서 공격 목록에 들어 있습니다. 복잡해 보이는 것과 예측하기 어려운 것은 다릅니다.

강도의 핵심은 엔트로피, 즉 예측 불가능성입니다

비밀번호의 강도를 말할 때 엔트로피라는 개념을 씁니다. 쉽게 말해 "공격자가 이 비밀번호를 맞히려면 평균적으로 몇 가지 후보를 시도해야 하는가"를 비트 수로 나타낸 것입니다. 비트가 1 늘어날 때마다 후보의 수는 두 배가 됩니다. 중요한 점은 이 계산이 선택 과정이 진짜 무작위일 때만 성립한다는 것입니다. 사람이 "그럴듯하게" 고른 비밀번호는 겉보기 길이보다 훨씬 낮은 엔트로피를 갖습니다.

무작위로 뽑은 문자가 하나 늘어나면 후보 수가 대략 수십 배로 늘지만, 사람이 정한 규칙(대문자 하나, 숫자 하나, 기호 하나)은 후보 수를 아주 조금만 늘립니다. 그래서 복잡한 규칙을 억지로 지키는 것보다 길이를 늘리는 쪽이 대체로 효과적입니다. 같은 노력이라면 "길게, 그리고 무작위로"가 원칙입니다.

외우기 쉬운 강한 암호문: 무작위 단어 조합

무작위 문자열은 강하지만 외울 수 없습니다. 그래서 단어 단위로 무작위를 만드는 방법이 널리 알려져 있습니다. 대표적인 것이 다이스웨어(Diceware) 방식입니다. 7776개 단어가 적힌 목록에서 주사위를 다섯 번 굴려 단어 하나를 고르는 방식으로, 단어 하나당 약 12.9비트의 엔트로피가 쌓입니다. 이렇게 단어를 4개 고르면 약 51비트, 6개를 고르면 약 77비트 정도입니다. 한 단어씩 늘 때마다 후보 수가 약 7776배가 되는 셈입니다.

여기서 중요한 조건은 단어를 사람의 머리가 아니라 주사위나 컴퓨터의 난수로 고르는 것입니다. "내가 좋아하는 단어 네 개"는 무작위가 아닙니다. 속담이나 노래 가사, 유명한 문장도 마찬가지입니다. 공격자는 그런 문장 목록을 이미 가지고 있기 때문입니다. 구체적으로 이런 식입니다. 단어 목록에서 무작위로 "구름, 계단, 빨대, 호수, 달력"을 뽑았다면 이 다섯 단어를 이어 놓고 머릿속에서 이야기로 엮습니다. 구름이 계단을 내려와 빨대로 호수를 마시고 달력에 낙서를 한다는 식으로 엉뚱한 장면일수록 오래 기억됩니다. 이 방식은 조합의 무작위성은 유지하면서 기억의 부담만 줄여 줍니다.

한국어로 직접 만들 때에는 공개된 단어 목록이 많지 않으므로, 주사위로 쪽수와 줄 번호를 정해 국어사전에서 단어를 뽑는 방법도 있습니다. 중요한 것은 규칙에 따라 기계적으로 고르는 것입니다. 이때 단어 수가 비밀번호의 강도를 좌우하므로 "짧은 단어 몇 개를 긴 것처럼 보이게 이어 붙이는" 대신, 가능하면 단어를 하나라도 더 넣는 편이 낫습니다.

흔히 하는 실수 몇 가지

비밀번호 관리 프로그램을 쓰는 방법도 권할 만합니다. 서비스마다 길고 무작위인 비밀번호를 자동으로 만들고 저장해 주므로, 우리는 관리 프로그램을 여는 하나의 강한 암호문만 기억하면 됩니다. 가능하다면 2단계 인증도 함께 켜 두시길 권합니다. 비밀번호가 새더라도 두 번째 관문이 남기 때문입니다.

암호화 서비스에서 비밀번호의 역할

로그인 비밀번호와 암호화에 쓰는 비밀번호는 위험의 성격이 조금 다릅니다. 로그인은 서버가 시도 횟수를 막을 수 있지만, 암호화된 데이터를 손에 넣은 공격자는 오프라인으로 무제한 시도할 수 있습니다. 그래서 암호화 도구는 비밀번호를 키로 바꾸는 과정을 일부러 느리게 만듭니다. 이 서비스는 PBKDF2를 600000번 반복하여 비밀번호에서 키 재료를 만듭니다. 후보 하나를 확인할 때마다 그만큼의 계산이 필요하므로 대입 공격의 속도가 크게 떨어집니다. 해시와 키 유도의 차이가 궁금하시다면 암호화·해시·인코딩의 차이를 참고하세요.

다만 느린 계산이 약한 비밀번호를 강하게 만들어 주지는 않습니다. 반복 횟수는 공격 시간을 늘릴 뿐이고, 흔한 비밀번호는 목록 앞쪽에서 금방 걸립니다. 이 서비스에서 비밀번호를 설정하면 번역기 주소의 키와 비밀번호가 함께 있어야 해독 키가 만들어지므로, 주소를 모르는 사람은 비밀번호만으로 시도할 수 없습니다. 그래도 주소가 새고 비밀번호가 짧다면 위험하므로, 비밀번호를 쓰신다면 위에서 설명한 단어 조합 방식으로 충분히 길게 만드시는 것이 좋습니다. 그리고 주소와 비밀번호를 같은 대화방에 같이 올리지 않는 것이 비밀번호를 거는 의미를 살리는 방법입니다.

오늘 바로 할 수 있는 정리

정리하면 강한 비밀번호의 공식은 단순합니다. 길게, 진짜 무작위로, 다른 곳과 겹치지 않게. 기호를 몇 개 섞느냐보다 이 세 가지가 훨씬 중요합니다. 중요한 계정 하나쯤은 주사위나 난수로 뽑은 5~6개 단어 조합으로 바꿔 보시고, 나머지는 관리 프로그램에 맡기며 2단계 인증을 켜 두시길 권합니다. 이렇게만 해도 대부분의 흔한 공격에 대해 충분한 방어가 됩니다.

잘못된 내용이나 보완할 점을 발견하셨다면 소개·문의의 이메일로 알려 주세요. 확인 후 글을 고치고 수정일을 갱신합니다.

함께 읽으면 좋은 글

다음 글: 시저 암호부터 시작하는 암호 이야기 → 번역기 열기