Argon2 해시 검증|비밀번호와 인코딩된 해시 비교
비밀번호와 Argon2 인코딩 해시($argon2id$...)를 입력해 일치 여부를 확인합니다. 계산은 브라우저에서만 이루어져 서버로 전송되지 않습니다.
Argon2 해시 대조란
Argon2는 2015년 패스워드 해싱 경진대회에서 우승한 알고리즘으로, 현재 **새로 만드는 구현에서 가장 권장되는 패스워드 해시**입니다. bcrypt와의 가장 큰 차이는 계산 시간뿐 아니라 **메모리 사용량도 조정할 수 있다**는 점입니다. GPU나 전용 하드웨어는 병렬 계산에는 능해도 각 코어에 대량의 메모리를 할당하기는 어렵기 때문에, 메모리를 요구함으로써 무차별 대입 공격의 비용을 끌어올릴 수 있습니다.
Argon2의 해시는 `$argon2id$v=19$m=19456,t=2,p=1$솔트$해시값`이라는 형태로, **파라미터와 솔트가 문자열 안에 박혀 있습니다.** 그래서 대조할 때 따로 파라미터를 지정할 필요가 없고, 해시와 패스워드 두 가지만으로 검증할 수 있습니다. 이 도구는 그 대조를 수행합니다. **계산은 모두 브라우저 안에서 완결되며, 입력한 패스워드나 해시가 서버로 전송되는 일은 없습니다.**
대조하는 순서
- Argon2 해시를 붙여 넣습니다 `$argon2id$`로 시작하는 인코딩된 문자열을 그대로 입력합니다.
- 패스워드를 입력합니다 대조하고 싶은 평문 패스워드를 넣습니다.
- 대조를 실행합니다 **메모리를 대량으로 쓰도록 설계되어 있어 처리에 몇 초가 걸릴 수 있습니다.** 이는 사양대로의 거동입니다.
- 결과를 확인합니다 일치했는지 여부가 표시됩니다.
더 잘 활용하기 위한 팁
- 검증에는 Argon2 해시 계산 도구로 생성한 인코딩된 해시($argon2id$로 시작하는 문자열)를 그대로 붙여넣으세요.
- 인코딩된 해시에는 변형·메모리 비용·반복 횟수·솔트 정보가 모두 포함되어 있어, 검증 시 이 매개변수들을 따로 지정할 필요가 없습니다.
- 해시 형식이 올바르지 않은 경우(복사 시 누락, 줄바꿈 혼입 등) 오류 메시지가 표시됩니다. 전체 문자열을 정확하게 복사했는지 확인해 주세요.
- 일치하지 않는다는 결과가 나왔다면 비밀번호의 대소문자나 앞뒤 공백 문자가 의도치 않게 포함되지 않았는지 확인해 보세요.
이럴 때 쓸 수 있습니다
구현한 인증 처리를 검증할 때
직접 만든 로그인 처리가 올바르게 대조하는지를 알려진 해시와 패스워드의 짝으로 확인할 수 있습니다.
이행 작업의 확인
다른 시스템에서 옮겨 온 해시가 그대로 검증되는 형식인지 미리 확인할 수 있습니다.
파라미터의 타당성을 볼 때
해시 문자열에 박힌 `m`·`t`·`p` 값에서 어느 정도의 비용이 설정되어 있는지 읽을 수 있습니다.
생성하는 쪽과 왕복시킬 때
Argon2 해시 생성 도구로 만든 값이 여기서 올바르게 대조되는지 확인할 수 있습니다.
Argon2 용어
- Argon2id
- Argon2의 세 변종 가운데 사이드채널 내성과 GPU 내성을 함께 갖춘 판입니다. **새로 만드는 구현에서는 이것을 고르는 것이 표준입니다.**
- m(메모리 비용)
- 쓰는 메모리 양을 키비바이트 단위로 지정합니다. **이것이 Argon2를 GPU 공격에 강하게 만드는 중심적인 파라미터입니다.**
- t(시간 비용)
- 반복 횟수입니다. 늘릴수록 계산 시간이 길어지고 공격자의 비용도 올라갑니다.
- p(병렬도)
- 병렬로 처리하는 레인 수입니다. 서버의 코어 수에 맞춰 설정합니다.
- 솔트
- 해시마다 바꾸는 난수입니다. **같은 패스워드라도 다른 해시가 되므로 레인보 테이블 공격을 무력화합니다.**
- 인코딩된 해시
- 알고리즘 이름·파라미터·솔트·해시값을 하나의 문자열로 모은 형식입니다. 대조에 필요한 정보가 모두 들어 있습니다.
자주 묻는 질문
여담이지만 ― 비밀번호는 왜 "해시 비교"만으로 검증할 수 있을까
비밀번호 검증은 겉보기에는 "저장된 비밀번호와 입력된 비밀번호를 직접 비교"하는 과정처럼 보이지만, 실제로는 전혀 다른 방식으로 이루어집니다. 서버(또는 이 도구처럼 클라이언트 측에서 처리하는 경우)는 입력된 비밀번호를 저장 시와 동일한 알고리즘·동일한 솔트로 다시 해시화한 뒤, 그 결과가 저장되어 있는 해시 값과 일치하는지만 비교합니다. 원래의 비밀번호 자체는 한 번도 '비교'의 대상이 되지 않으며, 해시 값끼리의 일치 여부만 판단하면 되는 것이 이 방식의 장점입니다.
이러한 방식이 성립하는 이유는 Argon2와 같은 해시 함수가 '결정적'(deterministic)이기 때문입니다. 동일한 입력·동일한 솔트·동일한 매개변수라면 항상 동일한 출력이 나옵니다. 인코딩된 해시 문자열($argon2id$v=19$m=...$salt$hash 형식)에는 계산 시 사용된 솔트와 매개변수가 모두 담겨 있기 때문에, 검증 시 원래의 매개변수를 따로 지정할 필요 없이 해시 문자열만으로 완전한 재계산이 가능합니다.
이러한 '일방향성'(해시로부터 원래의 비밀번호를 역산할 수 없음)과 '결정성'(동일한 입력이면 동일한 출력)이라는 두 가지 특성이 있기에, 서비스 운영자는 사용자의 원본 비밀번호를 전혀 저장하지 않고도 로그인 시 검증을 안전하게 수행할 수 있습니다. 데이터베이스가 유출되더라도 공격자가 손에 넣는 것은 해시 값뿐이며, Argon2처럼 계산 비용이 높은 알고리즘이라면 원래의 비밀번호를 복원하는 무차별 대입 공격에 매우 오랜 시간이 걸립니다.