암호 해시 생성기 & 검증기

bcrypt, scrypt, Argon2id, PBKDF2로 완전히 브라우저 안에서 암호를 해싱하고 검증합니다 — PHC 형식 문자열을 생성하고, 기존 해시에 후보 암호를 대조하며, 그 안에 숨은 매개변수를 살펴봅니다. 아무것도 업로드되지 않습니다.
테스트 암호 전용. 실제 사용자 암호는 어떤 웹 페이지에도 붙여넣으면 안 됩니다. 이 도구는 완전히 브라우저에서 동작합니다 — 문자열은 탭 밖으로 나가지 않습니다 — 하지만 실제 사고는 붙여넣기 한 번에서 시작됩니다.
bcrypt cost (2^cost 라운드)
bcrypt 변형 변형은 접두사만 바꿉니다. 해시 자체는 동일합니다
scrypt N (CPU 비용)
scrypt r / p r =   p = 블록 크기 128·r 바이트; 메모리 = 128·N·r 바이트 (N=214, r=8 → 16 MiB)
Argon2id m (메모리)
Argon2id t / p t =   p = t = 패스 수; p = 병렬도(레인)
PBKDF2 PRF
PBKDF2 반복 횟수  OWASP 2023: HMAC-SHA-256 기준 600,000 (SHA-1은 1,300,000, SHA-384/512는 210,000)
출력 길이(바이트)  bcrypt 출력은 23바이트로 고정입니다(31개 bcrypt-base64 문자)
알고리즘매개변수메모리출력 길이시간 (이 브라우저)
bcryptcost 124 KiB23바이트-
scryptN=214, r=8, p=116 MiB32바이트-
Argon2idm=19 MiB, t=2, p=119 MiB32바이트-
PBKDF2HMAC-SHA-256, 600,000회~032바이트-
매개변수 치트 시트(OWASP 암호 저장 치트 시트, 2023 최소값)
알고리즘최소값비고
Argon2idm = 19 MiB (19,456 KiB), t = 2, p = 1권장; 메모리 집약
scryptN = 214, r = 8, p = 1메모리 집약 (최소값에서 16 MiB)
bcryptcost = 10작업 인자만; 72바이트 암호 한도
PBKDF2-HMAC-SHA256600,000 반복반복 집약뿐 — GPU에 유리함; 코어 수만 조절 가능
이 페이지의 기본값은 모든 최소값과 같거나 그 위에 있습니다. 프로덕션에서는 Argon2id를 먼저 고르고, 사용할 수 없으면 scrypt나 bcrypt, PBKDF2는 FIPS 준수 이유로만 쓰세요.
PHP 상호 운용 — password_hash($pw, PASSWORD_BCRYPT)는 $2y$10$...을 냅니다. 검증에 후보 암호와 함께 붙여넣으면 이 페이지가 password_verify()와 정확히 같은 답을 줍니다. PASSWORD_ARGON2ID 출력($argon2id$v=19$m=65536,t=4,p=1$...)도 검증됩니다. passlib, django-argon2, crypto.scrypt 래핑의 PHC 문자열도 해석됩니다.
자체 테스트
페이지 엔진을 공개 벡터에 대해 재구동합니다: bcrypt의 crypt_blowfish 테스트 스위트, node/OpenSSL 생성 scrypt와 Argon2id 문자열, RFC 6070의 PBKDF2 벡터와 공개 SHA-256 세트, 모든 알고리즘의 생성-후-검증 왕복, 부정 테스트(틀린 암호는 실패해야 하고, 잘못된 문자열은 거부되어야 함). 아무것도 전송되지 않습니다.
암호 해싱 처음부터 설명
한 문장으로: 암호 해시는 의도적으로 느리게(그리고 가능하면 메모리를 많이 쓰게) 만들어져, 데이터베이스를 훔쳐도 공격자가 초당 수십억 번의 추측을 못 하게 합니다 — 속도를 위해 만들어진 SHA-256 같은 빠른 해시와는 정반대의 목표입니다.
왜 그냥 SHA-256으로 암호를 해싱하지 않나요?

현대 GPU에서 SHA-256은 초당 수십억 번의 추측을 합니다. 8글자 암호는 조합이 1013보다 훨씬 적습니다 — GPU 몇 시간, 대형 장비에서는 몇 분. 암호 해싱 함수(KDF)는 비용 매개변수로 맞섭니다: bcrypt는 코어를 2cost번 반복하고, PBKDF2는 HMAC을 수십만 번 반복하며, scrypt와 Argon2id는 추가로 추측마다 수 메가바이트의 메모리를 요구해 (빠르지만 코어당 메모리가 적은) GPU의 이점을 없앱니다. 솔트는 — 무작위이며 해시 문자열 안에 평문으로 저장됨 — 미리 계산된 레인보우 테이블을 막고 모든 추측을 사용자마다 새로 계산하게 만듭니다.

이 페이지의 네 알고리즘
알고리즘연도집약성서명 형식주의점
bcrypt1999CPU (2cost 키 설정)$2b$12$ + 22자 솔트 + 31자 해시72바이트 암호 한도(72 넘는 부분은 조용히 무시됨); 원래 C 구현에서는 NUL 바이트가 암호를 끝냄
PBKDF22000 (RFC 2898/8018)CPU (반복)$pbkdf2-sha256$i=600000$ + 솔트 + 해시 (passlib 방식)메모리 비용 없음 — GPU와 ASIC이 좋아함; 조절할 수 있는 것은 반복 횟수뿐
scrypt2009 (RFC 7914)CPU + 메모리 (128·N·r 바이트)$scrypt$ln=14,r=8,p=1$ + 솔트 + 해시N은 2의 거듭제곱이어야 함; 메모리는 r에 비례해 증가
Argon2id2015 (PHC 우승, RFC 9106)CPU + 메모리 (m KiB, t 패스)$argon2id$v=19$m=19456,t=2,p=1$ + 솔트 + 해시Argon2i (데이터 독립) vs Argon2d (데이터 의존) vs Argon2id (하이브리드) — 반대할 이유를 알지 못한다면 항상 id를 고르세요
메모리 집약 대 연산 집약

GPU는 수천 개의 코어를 가지지만 각 코어는 조금의 빠른 메모리만 쓸 수 있습니다. 추측마다 19 MiB 작업 집합이 필요한 KDF는 공격자를 메모리 19 MiB 조각 수만큼의 병렬 추측으로 제한합니다 — 그래서 노트북에서 실제 시간이 덜 걸리는데도 19 MiB의 Argon2id가 cost 15의 bcrypt보다 실전에서 더 강할 수 있습니다. PBKDF2는 이에 대한 답이 없습니다. 유일한 다이얼은 반복 횟수이고, 실리콘은 그것을 선형으로 확장합니다.

PHC 문자열 읽기

modular-crypt / PHC 형식은 자기 서술적입니다: $argon2id$v=19$m=19456,t=2,p=1$ICEiIyQlJicoKSorLC0uLw$WTGpK4hf...에서 필드는 알고리즘, 버전, 매개변수(m = KiB 단위 메모리, t = 패스, p = 레인), base64 솔트, base64 해시입니다. bcrypt는 표준 이전 것이라 자기만의 압축 형식을 씁니다: $2b$ 변형, 12 cost, 그리고 bcrypt 고유 base64 알파벳(./A-Za-z0-9)의 솔트와 해시. 이 페이지의 검증은 이 모두를 받고 파싱된 필드를 보여줍니다 — 아무 해시나 붙여넣어 무엇으로 분해되는지 보세요.

흔한 실수
  • 암호에 빠른 해시 쓰기. MD5/SHA-1/SHA-256 암호 칼럼은 일반 GPU로 초당 수십억 번의 추측에 무너집니다. 파일과 데이터에는 해시 생성기를, 암호에는 이 페이지의 알고리즘을 쓰세요.
  • 솔트 공유. 모든 사용자가 솔트 하나를 쓰면 같은 암호가 같은 해시가 되고 레인보우 테이블이 돌아옵니다. 여기서는 모든 해시에 새로운 16바이트 무작위 솔트가 들어갑니다.
  • bcrypt의 72바이트 무시. "a"*100과 "a"*72는 동일하게 해시됩니다 — 꼬리가 버려집니다. 이 페이지는 암호가 72바이트를 넘으면 입력 상자에서 경고합니다. Argon2에는 그런 한도가 없습니다.
  • 자기 코드에서 ==로 해시 비교. 검증은 상수 시간이어야 합니다. 페이지 엔진은 내부적으로 그렇게 합니다(다시 계산해 저장된 바이트와 비교). 접근법을 베껴 쓴다면 상수 시간 비교를 쓰세요.
  • 빠른 개발 머신에서 매개변수 조정. 여러분의 워크스테이션이 아니라 프로덕션 사용자의 중위 하드웨어에서 해싱이 약 250–500 ms 걸리게 목표를 잡으세요. 벤치마크 버튼이 이 브라우저가 실제 겪는 값을 보여줍니다.
  • 로그인 검증마다 재해싱. 먼저 검증하세요. 재해싱(비용 올리기 등)은 검증 성공 후에만 하고 새 문자열을 저장하세요. PHP의 password_needs_rehash()가 정확히 이것 위해 있습니다.
FAQ

무엇을 골라야 하나요? OWASP 최소값 이상의 Argon2id입니다. 런타임이 제공하지 않으면: scrypt, 그다음 bcrypt(해싱이 ≥250 ms 걸리도록 cost). PBKDF2는 인증 요구가 있을 때만.

왜 무작위 솔트가 출력 문자열에 보이죠? 솔트는 비밀이 아닙니다 — 검증에 문자열과 후보 암호만 필요하도록 일부러 PHC 문자열 안에 평문으로 저장됩니다. 임무는 비밀이 아니라 유일성입니다.

변형($2a$ / $2b$ / $2y$)은 중요한가요? ASCII 암호에서는 셋 다 동일한 해시를 냅니다. $2a$는 1990년대 원본, $2b$는 드문 부호 확장 버그 수정(2014), $2y$는 수정 있음을 표시하는 PHP의 마커입니다. 검증은 셋 다 받습니다.

해시는 얼마나 걸려야 하나요? 서버 하드웨어에서 로그인당 대략 250–500 ms. 100 ms 미만이면 오프라인 크래킹이 싸고, 1 s 초과면 보안이 좋아지기 전에 사용자가 불평합니다.

다른 곳에서 만든 해시를 검증할 수 있나요? 네 — 붙여넣고 후보 암호를 주세요. 검증된 형식: PHP password_hash(bcrypt $2y$와 Argon2id), Python passlib, django의 argon2 해셔, Tarsnap scrypt 도구의 scrypt 문자열 형식.

"벤치마크" 버튼은 뭘 하나요? 현재 암호를 페이지 기본 매개변수로 각 알고리즘마다 한 번 해싱하고 이 브라우저의 실제 시간을 보고합니다 — 비용 차이의 감각이지 엄밀한 측정이 아닙니다.