Argon2 해시 검증|비밀번호와 인코딩된 해시 비교

비밀번호와 Argon2 인코딩 해시($argon2id$...)를 입력해 일치 여부를 확인합니다. 계산은 브라우저에서만 이루어져 서버로 전송되지 않습니다.

Argon2 해시 대조란

Argon2는 2015년 패스워드 해싱 경진대회에서 우승한 알고리즘으로, 현재 **새로 만드는 구현에서 가장 권장되는 패스워드 해시**입니다. bcrypt와의 가장 큰 차이는 계산 시간뿐 아니라 **메모리 사용량도 조정할 수 있다**는 점입니다. GPU나 전용 하드웨어는 병렬 계산에는 능해도 각 코어에 대량의 메모리를 할당하기는 어렵기 때문에, 메모리를 요구함으로써 무차별 대입 공격의 비용을 끌어올릴 수 있습니다.

Argon2의 해시는 `$argon2id$v=19$m=19456,t=2,p=1$솔트$해시값`이라는 형태로, **파라미터와 솔트가 문자열 안에 박혀 있습니다.** 그래서 대조할 때 따로 파라미터를 지정할 필요가 없고, 해시와 패스워드 두 가지만으로 검증할 수 있습니다. 이 도구는 그 대조를 수행합니다. **계산은 모두 브라우저 안에서 완결되며, 입력한 패스워드나 해시가 서버로 전송되는 일은 없습니다.**

대조하는 순서

  1. Argon2 해시를 붙여 넣습니다 `$argon2id$`로 시작하는 인코딩된 문자열을 그대로 입력합니다.
  2. 패스워드를 입력합니다 대조하고 싶은 평문 패스워드를 넣습니다.
  3. 대조를 실행합니다 **메모리를 대량으로 쓰도록 설계되어 있어 처리에 몇 초가 걸릴 수 있습니다.** 이는 사양대로의 거동입니다.
  4. 결과를 확인합니다 일치했는지 여부가 표시됩니다.

더 잘 활용하기 위한 팁

  • 검증에는 Argon2 해시 계산 도구로 생성한 인코딩된 해시($argon2id$로 시작하는 문자열)를 그대로 붙여넣으세요.
  • 인코딩된 해시에는 변형·메모리 비용·반복 횟수·솔트 정보가 모두 포함되어 있어, 검증 시 이 매개변수들을 따로 지정할 필요가 없습니다.
  • 해시 형식이 올바르지 않은 경우(복사 시 누락, 줄바꿈 혼입 등) 오류 메시지가 표시됩니다. 전체 문자열을 정확하게 복사했는지 확인해 주세요.
  • 일치하지 않는다는 결과가 나왔다면 비밀번호의 대소문자나 앞뒤 공백 문자가 의도치 않게 포함되지 않았는지 확인해 보세요.

이럴 때 쓸 수 있습니다

구현한 인증 처리를 검증할 때

직접 만든 로그인 처리가 올바르게 대조하는지를 알려진 해시와 패스워드의 짝으로 확인할 수 있습니다.

이행 작업의 확인

다른 시스템에서 옮겨 온 해시가 그대로 검증되는 형식인지 미리 확인할 수 있습니다.

파라미터의 타당성을 볼 때

해시 문자열에 박힌 `m`·`t`·`p` 값에서 어느 정도의 비용이 설정되어 있는지 읽을 수 있습니다.

생성하는 쪽과 왕복시킬 때

Argon2 해시 생성 도구로 만든 값이 여기서 올바르게 대조되는지 확인할 수 있습니다.

Argon2 용어

Argon2id
Argon2의 세 변종 가운데 사이드채널 내성과 GPU 내성을 함께 갖춘 판입니다. **새로 만드는 구현에서는 이것을 고르는 것이 표준입니다.**
m(메모리 비용)
쓰는 메모리 양을 키비바이트 단위로 지정합니다. **이것이 Argon2를 GPU 공격에 강하게 만드는 중심적인 파라미터입니다.**
t(시간 비용)
반복 횟수입니다. 늘릴수록 계산 시간이 길어지고 공격자의 비용도 올라갑니다.
p(병렬도)
병렬로 처리하는 레인 수입니다. 서버의 코어 수에 맞춰 설정합니다.
솔트
해시마다 바꾸는 난수입니다. **같은 패스워드라도 다른 해시가 되므로 레인보 테이블 공격을 무력화합니다.**
인코딩된 해시
알고리즘 이름·파라미터·솔트·해시값을 하나의 문자열로 모은 형식입니다. 대조에 필요한 정보가 모두 들어 있습니다.

자주 묻는 질문

해시 계산은 비밀번호로부터 새로운 해시 값을 생성하는 것이고, 검증은 기존 해시 값과 비밀번호가 일치하는지 판단하는 과정입니다. 신규 가입 시에는 해시를 생성·저장하고, 로그인 시에는 검증만 수행하는 것이 일반적인 사용 방식입니다.

입력한 해시가 $argon2id$·$argon2i$·$argon2d$ 중 하나로 시작하는 올바른 인코딩 형식이 아닐 때 표시됩니다. 복사 시 문자가 빠지지 않았는지, 앞뒤에 불필요한 공백이나 줄바꿈이 포함되지 않았는지 확인해 주세요.

대소문자 차이, 전각·반각 문자 차이, 앞뒤 공백 문자 혼입 등이 주된 원인입니다. 비밀번호는 한 글자만 달라도 일치하지 않으므로 원본 문자열을 다시 확인해 주세요.

아니요. 입력한 내용은 모두 브라우저 내 WebAssembly에서 처리되며, 서버로 전송되거나 저장되는 일은 전혀 없습니다.

짝을 이루는 Argon2 해시 계산 도구를 이용해 주세요. Argon2id・Argon2i・Argon2d 세 가지 방식을 모두 지원합니다.
툴군

여담이지만 ― 비밀번호는 왜 "해시 비교"만으로 검증할 수 있을까

비밀번호 검증은 겉보기에는 "저장된 비밀번호와 입력된 비밀번호를 직접 비교"하는 과정처럼 보이지만, 실제로는 전혀 다른 방식으로 이루어집니다. 서버(또는 이 도구처럼 클라이언트 측에서 처리하는 경우)는 입력된 비밀번호를 저장 시와 동일한 알고리즘·동일한 솔트로 다시 해시화한 뒤, 그 결과가 저장되어 있는 해시 값과 일치하는지만 비교합니다. 원래의 비밀번호 자체는 한 번도 '비교'의 대상이 되지 않으며, 해시 값끼리의 일치 여부만 판단하면 되는 것이 이 방식의 장점입니다.

이러한 방식이 성립하는 이유는 Argon2와 같은 해시 함수가 '결정적'(deterministic)이기 때문입니다. 동일한 입력·동일한 솔트·동일한 매개변수라면 항상 동일한 출력이 나옵니다. 인코딩된 해시 문자열($argon2id$v=19$m=...$salt$hash 형식)에는 계산 시 사용된 솔트와 매개변수가 모두 담겨 있기 때문에, 검증 시 원래의 매개변수를 따로 지정할 필요 없이 해시 문자열만으로 완전한 재계산이 가능합니다.

이러한 '일방향성'(해시로부터 원래의 비밀번호를 역산할 수 없음)과 '결정성'(동일한 입력이면 동일한 출력)이라는 두 가지 특성이 있기에, 서비스 운영자는 사용자의 원본 비밀번호를 전혀 저장하지 않고도 로그인 시 검증을 안전하게 수행할 수 있습니다. 데이터베이스가 유출되더라도 공격자가 손에 넣는 것은 해시 값뿐이며, Argon2처럼 계산 비용이 높은 알고리즘이라면 원래의 비밀번호를 복원하는 무차별 대입 공격에 매우 오랜 시간이 걸립니다.