비밀번호가 데이터 유출에 포함되어 있나요?

데이터 유출이란 어떤 서비스의 비밀번호 데이터베이스가 외부로 빠져나가는 일입니다. 그리고 유출 말뭉치란 수백 건의 그런 유출에서 수집한 비밀번호의 모음으로, 색인이 되어 있어 누구나 특정 비밀번호가 그 안에 포함되어 있는지 물어볼 수 있습니다. 여러분의 비밀번호가 그 안에 있다면, 공격자는 이미 그것을 가지고 있습니다. 공격자가 도달할 수 있는 모든 로그인 페이지에 자동으로 시도되는 단어 목록에 올라 있습니다. 이 글에서는 비밀번호를 드러내지 않고 검사가 어떻게 동작하는지, “5,200만 번 발견됨”이라는 횟수가 실제로 무엇을 의미하는지, “찾지 못함”이 건강 증명서가 아닌 이유, 그리고 비밀번호가 안전한지 묻기 위해 비밀번호를 챗봇에 붙여 넣어서는 안 되는 이유를 설명합니다. 검사를 실행하려면 비밀번호 유출 검사를 사용하세요.

유출 말뭉치란 무엇인가

모든 대규모 유출은 같은 잔재를 남깁니다. 사용자 이름과 비밀번호의 데이터베이스입니다. 대개 해시 형태로 저장되어, 기업의 시스템에서 복사되어, 유통되고, 판매되고, 공개됩니다. 개별적으로 보면, 이러한 데이터베이스는 한 기업의 실패에 대한 증거에 불과합니다. 그러나 함께 모으고, 중복을 제거하고, 색인을 생성하면, 그것은 다른 것이 됩니다. 사람들이 실제로 사용하는 비밀번호에 대한 인구 조사입니다. Have I Been Pwned의 Pwned Passwords 말뭉치(이 사이트의 검사기가 조회하는 것)에는 수백 건의 유출에서 수집한 10억 개가 넘는 비밀번호가 들어 있으며, 새로운 유출이 나타날 때마다 계속 늘어납니다. 이것은 이론가들이 편찬한 취약한 비밀번호 목록이 아닙니다. 실제 사람들이 선택하고, 입력하고, 잃어버린 비밀번호에 대한 기록입니다.

그래서 말뭉치는 이토록 가차 없는 거울입니다. 여러분이 5초 만에 지어낸 비밀번호(이름에 출생 연도를 붙인 것, 스포츠 팀에 느낌표를 붙인 것, 끝에 숫자를 붙인 키보드 훑기)는 다른 수천 명이 정확히 같은 형태로 이미 지어냈을 가능성이 매우 높습니다. 그리고 그들 중 누군가가 침해된 서비스에서 그것을 사용했다면, 그것은 말뭉치에 들어 있습니다. 공격자는 사람처럼 비밀번호를 하나씩 추측하지 않습니다. 크리덴셜 스터핑을 합니다. 유출된 사용자 이름과 비밀번호 쌍의 목록, 또는 유출된 비밀번호의 단어 목록을 가져와, 시간당 수백만 번의 시도로, 모든 곳의 로그인 페이지에 자동으로 시도합니다. 말뭉치에 있는 비밀번호란 이미 목록에 올라 있는 비밀번호입니다.

다섯 글자 검사는 어떻게 동작하는가

10억 개의 항목이 있는 데이터베이스에 대해 비밀번호를 검사하려면 비밀번호를 누군가에게 보내야 할 것처럼 들립니다. 수년 동안 그것이 모든 유출 검사 서비스에 대한 솔직한 이의였습니다. 해결책은 k-익명성(k-anonymity)이라는 방법이며, 한 문장으로 말할 수 있을 만큼 단순합니다. 서비스는 여러분이 어떤 비밀번호를 물었는지 결코 알지 못합니다. 왜냐하면 그것을 식별할 만큼 충분히 보지 못하기 때문입니다. 비밀번호는 브라우저에서 SHA-1으로 해시되어 40자 지문이 만들어집니다. 그 지문의 처음 5자만 Have I Been Pwned로 전송됩니다. 서비스는 그 5자를 공유하는 모든 지문 접미사(대개 800개 정도)를 반환하고, 브라우저는 그 목록에서 자신의 접미사를 로컬에서, 자신의 기기에서 찾습니다.

5자라는 숫자가 핵심입니다. 5자 16진수 접두사에는 약 100만 개의 가능한 값이 있으므로, 10억 개의 항목이 있는 말뭉치에서는 각 접두사가 대략 1,000개의 비밀번호에 의해 공유됩니다. 서비스가 여러분의 비밀번호를 식별할 수 없을 만큼 충분히 많은 닮은 비밀번호가 있고, 답이 하나의 작은 응답에 들어갈 만큼 충분히 적습니다. 비밀번호 자체에 대한 어떤 정보도 네트워크를 가로지르지 않습니다. 비밀번호도, 전체 해시도, 심지어 그 길이에 대한 힌트조차도 말입니다. 같은 설계가 이 검사가 계정도, API 키도, 신경 쓸 만한 속도 제한도 필요로 하지 않는 이유이며, 응답을 수 주 동안 캐시할 수 있는 이유입니다. 어떤 접두사에 대한 답은 묻는 사람이 누구든 동일합니다. 이 사이트의 비밀번호 유출 검사는 바로 이 모델을 브라우저에서 구현하며, 해시는 무엇이든 전송되기 전에 로컬에서 계산됩니다.

“N번 발견됨”은 무슨 뜻인가 — 그리고 무엇을 해야 하는가

0보다 큰 횟수는 그 비밀번호가 유출에서 그만큼 목격되었다는 뜻이며, 그 숫자는 얼마나 빨리 시도될지를 직접적으로 보여주는 척도입니다. 수백만 회의 횟수 — “password” 자체는 5천만 번 이상 목격되었습니다 — 는 그 비밀번호가 모든 크리덴셜 스터핑 실행에서 가장 먼저 시도되는 추측 중 하나라는 뜻이며, 사용하는 모든 곳에서 바꿔야 합니다. 다른 계정을 보호하는 계정부터 시작하세요. 먼저 이메일, 그 다음 은행, 그 다음 비밀번호 복구 경로입니다. 횟수가 작다고 해서 합격은 아닙니다. 단 한 번의 등장만으로도 그 비밀번호가 공격자의 단어 목록에 들어 있다는 뜻이며, 대개는 추측 가능한 패턴을 따르고 있다는 신호이기도 합니다. 같은 패턴이 그 옆에 수천 개의 닮은 비밀번호를 말뭉치에 넣었습니다.

횟수와 관계없이 해결책은 같습니다. 다른 어디에서도 사용한 적 없는 고유한 비밀번호로 교체하고, 머리 속이 아니라 비밀번호 관리자에 보관하세요. 인간의 기억이 바로 재사용된 비밀번호가 존재하는 이유입니다. 누구도 100개의 서로 다른 무작위 문자열을 기억할 수 없습니다. 관리자는 고유성을 감당할 수 있게 만드는 도구입니다. 비밀번호 생성기로 대체 비밀번호를 생성해 관리자에 저장한 뒤, 오래된 비밀번호가 사용되던 모든 서비스에서 비밀번호를 바꾸세요. 공격자가 다른 계정을 재설정할 수 있게 하는 서비스부터 시작하세요. 같은 비밀번호가 여러 계정을 보호하고 있었다면, 모두 노출된 것으로 간주하세요. 공격자는 유출된 비밀번호를 유출된 곳뿐만 아니라 도달할 수 있는 모든 서비스에 시도합니다.

“찾지 못함”이 의미하지 않는 것

횟수가 0인 것은 좋은 소식이지만, 엄격한 한계가 있습니다. 그 비밀번호가 이 말뭉치가 알고 있는 유출에서는 목격되지 않았다는 뜻에 불과합니다. 그 이상은 아닙니다. 비밀번호가 강하다는 뜻이 아닙니다. 사전 단어에 숫자를 붙여 만든 짧은 비밀번호는 말뭉치에 없을 수 있지만, 몇 분 만에 추측 공격에 무너질 수 있습니다. 추측에는 비밀번호가 먼저 유출될 필요가 없기 때문입니다. 비밀번호가 안전하다는 뜻이 아닙니다. 유출이 표면화되려면 수개월에서 수년이 걸리며, 아직 보고되지 않은 유출 속에 있는 비밀번호는 그렇지 않게 되는 날까지 모든 말뭉치에서 보이지 않습니다. 그리고 재사용된 비밀번호가 괜찮다는 뜻도 아닙니다. 10개 사이트에서 사용된 비밀번호는 오늘의 횟수가 어떻든, 단 한 번의 유출로 10곳을 모두 잃게 됩니다.

0을 솔직하게 읽는 방법은 여러 검사 중 하나를 통과한 것으로 보는 것입니다. 그 비밀번호는 유출된 것으로 알려지지 않았습니다. 그것은 알 가치가 있으며, 검사가 알려줄 수 있는 유일한 것입니다. 그것이 충분히 길고, 충분히 무작위이며, 정확히 한 곳에서만 사용되는지는 별개의 질문이며, 검사는 그것에 답할 수 없습니다. 지킬 가치가 있는 기준은 아래에 나열된 NIST의 기억 비밀 지침에 있는 것입니다. 복잡성 규칙보다 길이를 우선하고, 그 자체를 위한 주기적 변경을 결코 요구하지 않으며, 새 비밀번호가 선택되는 순간에 유출 말뭉치와 대조해 검사하는 것. 그것이 바로 이 글에서 설명하는 검사입니다. 길고, 무작위이며, 고유하고, 발견되지 않은 비밀번호는 좋은 비밀번호입니다. 그 네 가지 속성 중 하나라도 제거하면, 0의 의미는 크게 줄어듭니다.

비밀번호를 챗봇에 붙여 넣지 마세요

“제 비밀번호는 안전한가요?”라고 묻는 가장 위험한 방법은 비밀번호를 챗봇이나 AI 어시스턴트에 붙여 넣고 직접 묻는 것입니다. 채팅은 대화 기록을 남깁니다. 여러분의 비밀번호는 타인의 서버에 저장되고, 그들의 보존 정책에 따라 보관되며, 모델을 훈련하거나 조정하는 데 사용되고, 이후 답변에서 그대로 인용될 가능성도 있습니다. 완전히 다른 누군가에게 말입니다. 같은 규칙은 폼에 비밀번호를 입력하면 판단해주겠다고 약속하는 모든 웹사이트에도 적용됩니다. 이 사이트의 검사기처럼 페이지가 비밀번호를 로컬에서 해시하고 그 방식을 보여주지 않는 한, 비밀번호가 전송되고, 저장되고, 기록되고 있다고 가정하세요. 유출 검사가 할 가치가 있는 이유는, 바로 비밀을 누구에게도 넘기지 않고 수행할 수 있기 때문이며, 비밀을 채팅에 붙여 넣어 묻는 순간, 여러분은 검사가 감지하기 위해 존재하는 노출 그 자체를 만들어낸 것입니다.

이 규칙은 일반화됩니다. 비밀번호, API 키, 토큰, 개인 키는 모두 채팅, 티켓, 포럼 게시물, 공유 문서에 날것 그대로 입력해서는 안 되는 것들입니다. 그래서 이 사이트에는 공유하기 전에 텍스트에서 그것들을 제거하는 시크릿 리댁터가 있으며, 붙여 넣기 전에 시크릿 가리기에 대한 함께 제공되는 글도 있습니다. 비밀을 정말로 넘겨야 할 때는 비밀 관리자나 만료되는 일회성 보기 공유 링크를 통해, 논의와는 별개의 채널로 보내세요. 그리고 비밀번호가 유출되었는지 알아야 할 때는 그 질문을 위해 만들어진 방식을 사용하세요. 로컬에서 해시하고, 다섯 글자를 보내고, 나머지는 자신의 기기에서 대조하는 것입니다. 그것이 검사의 전부이며, 새로운 유출을 만들어 스스로에게 답하지 않는 유일한 질문의 형태입니다.

출처 및 더 읽을거리

자주 묻는 질문

Have I Been Pwned로 비밀번호를 검사하는 것이 안전한가요?

예, 범위 API의 방식으로 수행한다면 안전합니다. 비밀번호는 브라우저에서 해시되며 해시의 처음 5자만 전송됩니다. Have I Been Pwned는 비밀번호나 전체 해시를 결코 보지 못하며, 그 접두사를 공유하는 수백 개의 비밀번호 중 여러분이 물은 것이 어느 것인지 알 수 없습니다. 같은 질문을 하기 위해 비밀번호를 챗봇이나 비밀번호를 통째로 보내는 폼에 붙여 넣지 마세요.

비밀번호가 유출에서 발견되었습니다. 먼저 무엇을 바꿔야 하나요?

다른 계정을 보호하는 계정부터 시작하세요. 먼저 이메일입니다. 이메일은 다른 거의 모든 것을 재설정할 수 있기 때문입니다. 그 다음 은행과 비밀번호 복구 경로, 그리고 그 비밀번호를 공유했던 나머지 모든 계정입니다. 비밀번호 생성기로 각각에 새롭고 고유한 대체 비밀번호를 생성해 비밀번호 관리자에 저장하세요. 오래된 비밀번호는 어디에서도 다시 사용하지 말고, 그것을 공유했던 모든 계정을 노출된 것으로 간주하세요.

비밀번호가 말뭉치에 없어도 취약할 수 있나요?

예. “찾지 못함”은 그 비밀번호가 알려진 유출에서는 목격되지 않았다는 뜻에 불과합니다. 짧거나 예측 가능한 비밀번호(사전 단어에 숫자를 붙인 것, 이름에 연도를 붙인 것)는 말뭉치에 없을 수 있지만, 몇 분 만에 추측에 무너질 수 있습니다. 길고, 무작위이며, 하나의 사이트에만 고유하고, 발견되지 않을 때만 비밀번호를 유지하세요.