비밀번호는 얼마나 강해야 하는가

비트 단위 엔트로피가 실제로 무엇을 재는지, 왜 기호를 잔뜩 섞는 것보다 길이가 나은지, 비밀번호 재사용의 대가는 무엇인지, 그리고 패스프레이즈와 비밀번호 관리자는 어디에 들어맞는지 설명합니다.

잃으면 곤란한 계정에는 무작위로 생성한 16자 이상의 비밀번호나 무작위로 고른 5개 이상의 단어로 만든 패스프레이즈를 쓰고, 그것을 오직 한 사이트에서만 쓰십시오. 이는 65에서 95비트의 엔트로피로 무차별 대입 공격의 사정거리를 여유 있게 벗어나며, 사실 "한 사이트에서만"이라는 부분이 강도보다 더 중요합니다. 아래는 그 숫자들의 근거입니다.

비트 단위 엔트로피

엔트로피는 비밀번호가 똑같이 가능성 있는 몇 가지 경우의 수에서 뽑혔는지를 2의 거듭제곱으로 나타낸 값입니다. 엔트로피 40비트는 2^40가지, 즉 약 1조 가지 중 하나라는 뜻이며, 비트가 하나 늘어날 때마다 추측에 드는 노력이 두 배가 됩니다. 공식은 비트 = 길이 x log2(문자 집합의 크기)이므로, 소문자는 한 글자당 4.7비트, 영문자와 숫자는 5.95비트, 인쇄 가능한 ASCII 전체는 6.57비트이며, 7,776단어 목록에서 뽑은 단어 하나는 12.9비트입니다.

비밀번호엔트로피
소문자 8자38비트
영문자와 숫자 12자71비트
ASCII 전체 12자79비트
영문자와 숫자 16자95비트
무작위 단어 5개65비트
무작위 단어 6개78비트

이 계산은 비밀번호가 실제 무작위 과정에서 나왔을 때만 성립합니다. Tr0ub4dor&3는 95개 문자 집합에서 뽑은 11자이므로 공식으로는 72비트가 나오지만, 이것은 예측 가능한 문자 치환을 적용한 사전 단어이고 크래킹 도구는 그보다 훨씬 빨리 도달합니다. 엔트로피는 문자열이 아니라 생성기를 설명하는 값입니다.

그 비트로 무엇을 얻는가

추측 속도는 사이트가 비밀번호를 어떻게 저장했는지에 달려 있습니다. 요청 속도 제한이 걸린 실제 로그인 폼을 상대한다면 공격자는 시간당 몇 번밖에 시도하지 못합니다. 탈취된 데이터베이스를 상대할 때는 해시에 따라 달라집니다. MD5나 SHA-1처럼 빠른 해시는 일반 소비자용 그래픽 하드웨어에서도 어마어마한 속도로 시도할 수 있는 반면, bcrypt나 Argon2처럼 비밀번호를 위해 만들어진 해시는 그보다 여러 자릿수만큼 느립니다.

아래는 최악의 경우, 즉 솔트 없는 빠른 해시를 초당 100억 번 추측한다고 가정한 값입니다. 곡선이 얼마나 가파르게 꺾이는지를 보여주기 위한 것이지 측정값이 아닙니다.

엔트로피전체 공간을 다 훑는 데 걸리는 시간
40비트약 2분
50비트약 하루
60비트수 년
70비트수천 년
80비트수백만 년

평균적으로 공격자는 그 절반의 시간에 성공합니다. 실무적으로 읽자면 이렇습니다. 50비트 아래는 오프라인 공격에 대해 큰 의미가 없고, 60에서 70비트면 대부분의 용도에 충분하며, 80비트 이상이면 앞으로도 여유가 있습니다.

기호를 섞는 것보다 길이가 낫습니다

영문자와 숫자로 이루어진 12자 비밀번호(71비트)를 예로 들어봅시다. 문장 부호를 더해 문자 집합을 62개에서 95개로 넓히면 79비트가 됩니다. 대신 영문자나 숫자를 두 자 더 붙이면 83비트가 됩니다. 문자를 하나 더할 때마다 탐색 공간이 알파벳 전체 크기만큼 곱해지는 반면, 알파벳을 넓히는 것은 이미 있던 문자 하나당 약 0.6비트만 더해줍니다. 길이가 이기고, 계속 이깁니다.

구성 규칙("대문자, 숫자, 기호를 반드시 포함해야 합니다")은 사람들을 좁은 패턴 집합으로 밀어 넣습니다. 대문자는 맨 앞, 숫자와 느낌표는 맨 뒤로 가는 식입니다. 크래킹 도구는 그런 변형부터 먼저 시도합니다. NIST의 디지털 신원 지침이 구성 규칙과 주기적 강제 변경에서 벗어나 길이와 유출 비밀번호 목록 대조 쪽으로 옮겨 간 이유 중 하나가 이것입니다.

진짜 위험은 재사용입니다

무차별 대입 공격으로 계정을 빼앗기는 사람은 거의 없습니다. 실제로 벌어지는 일은 크리덴셜 스터핑입니다. 보안이 허술한 사이트가 뚫려 이메일과 비밀번호 쌍이 공개되면, 자동화된 도구가 그 쌍들을 수백 개의 다른 서비스에 시도합니다. 뚫린 게시판과 같은 비밀번호를 이메일 계정에도 썼다면 그 비밀번호의 강도는 아무 의미가 없습니다. 추측당한 것이 아니라 건네준 것이기 때문입니다.

피싱도 같은 방식으로 작동합니다. 그럴듯한 가짜 로그인 페이지에 입력한 30자 비밀번호의 값어치는 password1과 정확히 같습니다. 그러므로 중요한 순서대로 정리하면 이렇습니다.

  1. 사이트마다 서로 다른 비밀번호를 쓸 것.
  2. 중요한 계정, 무엇보다 이메일에 2단계 인증을 걸 것. 이메일이 다른 모든 계정의 재설정 경로이기 때문입니다.
  3. 오프라인 크래킹이 가망 없어질 만큼 충분한 길이를 확보할 것.

패스프레이즈

패스프레이즈는 목록에서 무작위로 고른 여러 단어를 이어 붙인 것이며, 예를 들면 harvest-cobalt-mural-drift-plinth 같은 형태입니다. 단어당 12.9비트이므로 다섯 단어는 65비트, 여섯 단어는 78비트입니다.

이것이 통하려면 두 가지 조건이 필요합니다. 단어는 본인이 고르는 것이 아니라 주사위나 소프트웨어로 무작위로 뽑아야 합니다. 그리고 강도는 구분자나 한 글자를 대문자로 바꾸는 데서 나오는 것이 아니라 단어의 개수에서 나옵니다. 노래 가사나 인용문에는 엔트로피가 거의 없습니다. 사람들이 입에 올리는 문구라는 작은 집합에서 뽑혔기 때문입니다.

패스프레이즈는 외워서 직접 입력해야 하는 몇 안 되는 비밀번호에서 값어치를 합니다. 기기 로그인, 관리자 프로그램의 마스터 비밀번호, 디스크 암호화 같은 것들입니다.

비밀번호 관리자의 자리

비밀번호 관리자는 "고유한 비밀번호 200개를 지어내고 외우기"를 "긴 패스프레이즈 하나 외우기"로 바꿔줍니다. 엔트로피가 높은 문자열을 생성해 주고 올바른 도메인에서만 채워 넣어 주므로 피싱의 위력도 무디게 만듭니다. 비슷하게 생긴 주소에서는 자동 입력을 하지 않기 때문입니다.

이 방식이 위험을 한곳에 모으는 것은 사실이고 타당한 반론이지만, 그래도 더 나은 거래입니다. 긴 패스프레이즈와 두 번째 인증 수단으로 지키는 금고 하나가, 품질을 알 수 없는 수십 개 사이트에 공유된 비밀번호 하나보다 낫습니다.

해싱에 관한 한마디

해싱은 로그인의 반대쪽 면입니다. 잘 만든 서비스는 비밀번호 자체가 아니라 의도적으로 느린 알고리즘으로 만든 솔트 붙은 해시를 저장하므로, 유출이 곧바로 평문으로 이어지지 않습니다. SHA-256 같은 범용 해시는 빠르도록 만들어졌고, 그래서 파일 체크섬에는 훌륭하고 비밀번호 저장에는 나쁜 선택입니다. 자기 비밀번호를 직접 해싱해서 "더 강하게" 만드는 일은 아무것도 얻어주지 못합니다. 결과물은 입력만큼만 추측하기 어렵기 때문입니다.