알아두면 좋은 내용
어떻게 사용하나요?
- 텍스트 — 입력하는 즉시(200ms 디바운스) MD5·SHA-1·SHA-256·SHA-384·SHA-512 다섯 값을 동시에 보여 줍니다. 출력 형식(hex 소문자·대문자, Base64, Base64URL)과 인코딩(UTF-8·ASCII)을 고를 수 있습니다.
- 파일 — 끌어다 놓거나 선택하면 다섯 해시와 SRI 값을 계산합니다. 배포처가 공개한 체크섬을 ‘예상 해시’에 붙여넣으면 일치 여부를 바로 표시합니다.
- HMAC — 비밀키와 메시지로 HMAC-SHA1/256/384/512 서명을 만듭니다. 키는 텍스트·hex·Base64로 넣을 수 있고, GitHub·Slack·AWS·JWT 프리셋이 알고리즘과 출력 형식을 맞춰 줍니다.
- 가이드 — 알고리즘 비교, 안전성 등급, SRI 사용법, CLI 명령 대조표.
출력 형식·인코딩·HMAC 알고리즘 같은 옵션만 이 브라우저에 저장합니다. 입력 텍스트·비밀키·파일은 저장하지도, 서버로 보내지도 않습니다(MD5는 자체 JavaScript 구현, 나머지는 브라우저 내장 Web Crypto API).
해시 알고리즘 비교 — 출력 길이로 알고리즘 알아보기
해시는 입력 길이와 상관없이 항상 같은 길이로 나옵니다. 그래서 받은 체크섬이 어떤 알고리즘인지 모르면 글자 수로 먼저 가늠할 수 있습니다 — hex 32자면 MD5, 40자면 SHA-1, 64자면 SHA-256입니다. 본 도구의 파일 검증도 붙여넣은 값의 길이가 고른 알고리즘과 다르면 ‘변조’가 아니라 ‘알고리즘 불일치’로 따로 알려 줍니다.
| 알고리즘 | 출력 | hex | Base64 | Base64URL | 안전성 | 주 용도 |
|---|---|---|---|---|---|---|
| MD5 | 128비트 | 32자 | 24자 | 22자 | 무결성 전용 | 체크섬, 캐시 버스팅, 중복 검출 |
| SHA-1 | 160비트 | 40자 | 28자 | 27자 | 무결성 전용 | Git 커밋 ID, 레거시 호환, HMAC-SHA1 |
| SHA-256 | 256비트 | 64자 | 44자 | 43자 | 안전 | HTTPS, 블록체인, JWT, SRI, 디지털 서명 |
| SHA-384 | 384비트 | 96자 | 64자 | 64자 | 안전 | SRI(integrity), TLS, 고보안 |
| SHA-512 | 512비트 | 128자 | 88자 | 86자 | 안전 | 고보안 디지털 서명, 금융, 정부 표준 |
길이는 본 도구의 알고리즘 정의에서 계산한 값입니다(Base64는 끝의 = 패딩 포함, Base64URL은 패딩 제외). SHA-384는 SHA-512를 다른 초깃값으로 계산해 앞 384비트만 쓰는 변형이라, 64비트 CPU에서 SHA-256보다 빠른 경우가 많습니다 — 다만 SHA 전용 명령어(SHA-NI 등)가 있는 최신 CPU에서는 SHA-256이 더 빠를 수 있습니다.
보이는 글자가 같아도 해시가 다른 이유 — 테스트 벡터
해시 함수는 글자가 아니라 바이트를 읽습니다. 아래 표는 본 도구의 텍스트 해시 함수로 직접 계산한 값으로, 줄바꿈 한 글자·보이지 않는 BOM·인코딩 모드만 달라도 결과가 완전히 바뀌는 것을 보여 줍니다(입력이 1비트만 바뀌어도 출력 비트의 약 절반이 바뀌는 ‘눈사태 효과’). 다른 도구와 값이 다를 때는 이 표의 경우부터 의심해 보세요.
| 입력 | 실제 바이트 (hex) | 바이트 수 | SHA-256 앞 16자리 | 포인트 |
|---|---|---|---|---|
| 빈 문자열 | (없음) | 0 | e3b0c44298fc1c14… | 입력이 비어도 해시는 나온다 — 파일 해시가 이 값이면 빈 파일이거나 읽기에 실패한 것 |
| abc | 61 62 63 | 3 | ba7816bf8f01cfea… | FIPS 180 예제 입력. 구현을 점검할 때 쓰는 기준값 |
| abc + LF | 61 62 63 0a | 4 | edeaaff3f1774ad2… | echo abc | sha256sum 의 결과. echo가 줄바꿈을 붙인다 |
| abc + CRLF | 61 62 63 0d 0a | 5 | 552bab6864c7a7b6… | Windows 줄바꿈. 0D 한 바이트 차이로 완전히 다른 값 |
| BOM + abc | ef bb bf 61 62 63 | 6 | 1c28dc3f1f804a1a… | “UTF-8 (BOM)”으로 저장한 파일. 앞에 EF BB BF가 붙는다 |
| 한글 (UTF-8) | ed 95 9c ea b8 80 | 6 | bd87f9bb68b67d2f… | 한글 한 글자 = UTF-8 3바이트 |
| 한글 (ASCII 모드) | 3f 3f | 2 | e270aeb347f21655… | ASCII 밖 문자가 모두 ?(3F)로 바뀌어 "??"와 같은 해시가 된다 |
검산용 기준값 — 텍스트 탭에 abc를 입력했을 때 SHA-256이 ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad, MD5가 900150983cd24fb0d6963f7d28e17f72이면 계산이 표준과 일치합니다. 터미널에서 같은 값을 얻으려면 printf abc | sha256sum처럼 줄바꿈 없이 넘겨야 합니다. EUC-KR(CP949)로 저장된 한글 파일은 한 글자가 2바이트라, 같은 문장을 UTF-8로 입력한 텍스트 탭 결과와 다릅니다 — 이럴 땐 파일 탭으로 원본 바이트를 그대로 해시하세요.
안전성 등급 — 무엇에 써도 되고 무엇에 쓰면 안 되나
기준은 ‘누군가 일부러같은 해시를 가진 다른 데이터를 만들 동기가 있느냐’입니다. 공격자가 끼어들 수 있는 곳이면 충돌 저항성이 필요하고, 우연한 손상만 걸러내면 되는 곳이면 MD5로도 충분합니다.
- 비밀번호 저장 — 단순 해시는 SHA-256도 부적합. Argon2id·bcrypt·scrypt(서버)
- 디지털 서명·코드 서명 — 충돌 쌍으로 서명을 다른 문서에 옮겨 붙일 수 있음. SHA-256 이상 + RSA/ECDSA
- TLS 인증서 — 주요 브라우저가 SHA-1 서명 인증서를 신뢰하지 않음
- JWT 서명 — JWS 표준 HMAC 알고리즘은 HS256·HS384·HS512뿐(HMAC-SHA1은 목록에 없음)
- 파일 체크섬 — 다운로드 중 손상 여부 확인. 단, 체크섬 자체를 같은 서버에서 받는다면 변조까지는 막지 못하므로 배포처가 SHA-256과 서명(GPG 등)을 함께 제공하면 그쪽을 쓰세요.
- 중복 파일 찾기·캐시 키 — 같은 내용을 빠르게 식별하는 용도. 충돌을 일부러 만들 사람이 없는 내부 데이터라면 MD5도 무방합니다.
- Git 커밋 ID — SHA-1 기반(충돌 탐지 기능을 넣은 변형). Git은 SHA-256 저장소 형식을 도입해 전환 중입니다.
- 레거시 연동 — 상대 시스템이 MD5·SHA-1만 받을 때. 새로 설계한다면 SHA-256 이상을 쓰세요.
알려진 충돌 공격: MD5 2004(Wang 외) · SHA-1 SHAttered 2017.02(Google·CWI) · SHA-1 chosen-prefix 2020.01. NIST는 2030년 12월 31일까지 SHA-1을 SHA-2·SHA-3로 교체하도록 권고합니다.
HMAC 서명 — 서비스별 형식과 검증할 때 틀리는 곳
HMAC은 비밀키와 메시지를 함께 해시해, 키를 가진 쪽만 올바른 값을 만들 수 있게 한 메시지 인증 코드입니다. 서비스마다 무엇을 서명하는지(본문만? 타임스탬프 포함?)가 달라서, 알고리즘을 맞춰도 서명 대상 문자열이 다르면 값이 일치하지 않습니다.
| 서비스 | 알고리즘 · 형식 | 전송 위치 | 서명 대상 |
|---|---|---|---|
| GitHub Webhook | HMAC-SHA256 · hex | X-Hub-Signature-256: sha256=… | 요청 본문 원문(raw body) |
| Slack | HMAC-SHA256 · hex | X-Slack-Signature: v0=… | v0:{X-Slack-Request-Timestamp}:{본문} |
| Stripe Webhook | HMAC-SHA256 · hex | Stripe-Signature: t=…,v1=… | {t}.{본문} |
| AWS Signature V4 | HMAC-SHA256 · hex | Authorization 헤더 | 비밀키 → 날짜 → 리전 → 서비스 → aws4_request 순으로 4번 HMAC해 만든 서명 키로 StringToSign 서명 |
| JWT HS256·HS384·HS512 | HMAC-SHA256/384/512 · Base64URL | 토큰의 세 번째 부분 | Base64URL(헤더).Base64URL(페이로드) |
- 본문을 다시 직렬화하지 말 것 — 프레임워크가 JSON을 파싱한 뒤 다시 문자열로 만들면 공백·키 순서·유니코드 이스케이프가 바뀌어 서명이 틀어집니다. 받은 원문 바이트로 계산하세요.
- 접두어·구분자 확인 — GitHub은
sha256=, Slack은v0=이 헤더 값 앞에 붙습니다. 비교 전에 떼거나, 계산 결과에 같은 접두어를 붙이세요. - 상수 시간 비교 — 문자열
==대신 Node의crypto.timingSafeEqual, Python의hmac.compare_digest를 쓰면 응답 시간 차이로 서명을 추측하는 공격을 막을 수 있습니다. - 타임스탬프 검사 — Slack·Stripe는 서명에 시각을 포함합니다. 몇 분(두 서비스 모두 5분을 권장·기본값으로 안내)보다 오래된 요청을 거절해야 재전송 공격을 막습니다.
직접 확인해 보기 — HMAC 탭에서 키 key, 메시지 The quick brown fox jumps over the lazy dog, HMAC-SHA256·hex를 고르면 f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8가 나와야 합니다(본 도구의 서명 함수로 빌드 때 계산한 값).
파일 무결성 검증 — CLI 명령 대조표
OS 설치 이미지나 설치 파일은 배포처가 SHA-256 값(SHA256SUMS 파일 등)을 함께 공개합니다. 내려받은 파일로 같은 값을 계산해 비교하면 손상 여부를 알 수 있습니다. 본 도구의 파일 탭 결과는 아래 명령의 출력과 같아야 합니다.
| 알고리즘 | Linux | macOS | Windows (cmd / PowerShell) |
|---|---|---|---|
| MD5 | md5sum FILE | md5 FILE | certutil -hashfile FILE MD5 / Get-FileHash FILE -Algorithm MD5 |
| SHA-1 | sha1sum FILE | shasum -a 1 FILE | certutil -hashfile FILE SHA1 / Get-FileHash FILE -Algorithm SHA1 |
| SHA-256 | sha256sum FILE | shasum -a 256 FILE | certutil -hashfile FILE SHA256 / Get-FileHash FILE |
| SHA-512 | sha512sum FILE | shasum -a 512 FILE | certutil -hashfile FILE SHA512 / Get-FileHash FILE -Algorithm SHA512 |
PowerShell Get-FileHash는 알고리즘을 생략하면 SHA-256으로 계산하고 대문자 hex로 출력합니다. 본 도구의 ‘예상 해시’ 칸은 대소문자를 구분하지 않고,sha256sum 출력 한 줄(해시 + 파일명), BSD·macOS 형식(SHA256 (file) = …), 바이트 사이에 공백·콜론이 들어간 형식에서도 해시 부분만 골라 비교합니다. 여러 파일을 한 번에 확인할 때는 터미널의 sha256sum -c SHA256SUMS가 편합니다.
자주 묻는 질문
MD5는 안전한가요?
SHA-1은 사용해도 되나요?
비밀번호를 SHA-256으로 해싱하면 안 되나요?
crypto.scrypt·Python hashlib.scrypt처럼 솔트를 인자로 받는 API가 많아 무작위 솔트를 직접 만들어 해시와 함께 저장해야 합니다. 브라우저에서 해시해 서버로 보내는 방식은 그 해시값이 곧 비밀번호 역할을 하게 되므로 서버 측 처리를 대신하지 못합니다.HMAC과 일반 해시의 차이는?
HMAC(K, m) = H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ m))(RFC 2104)으로 계산하므로 키를 모르면 올바른 값을 만들 수 없습니다. 그래서 웹훅·API 요청이 정말 상대방에게서 왔는지, 중간에 바뀌지 않았는지 확인하는 데 씁니다. GitHub·Slack·Stripe 웹훅, AWS Signature V4, JWT HS256이 모두 HMAC-SHA256을 씁니다. 본 도구의 HMAC 탭에는 이 중 4개 서비스의 알고리즘·출력 형식 프리셋이 있습니다.같은 파일인데 다른 사이트·명령과 해시가 달라요
echo가 끝에 붙이는 줄바꿈(echo -n 또는 printf로 비교), ⑤ 알고리즘을 잘못 고름, ⑥ 다운로드 중 손상입니다. 반대로 파일 이름·수정 시각 같은 메타데이터는 해시에 들어가지 않습니다 — 이름만 바꾼 파일은 해시가 같습니다. 본 도구의 파일 해시는 같은 파일에 대한 sha256sum·shasum·certutil 결과와 일치해야 정상입니다.큰 파일도 해시할 수 있나요?
sha256sum file.iso(Linux)·shasum -a 256 file.iso(macOS)·Get-FileHash file.iso(PowerShell)를 권장합니다.SRI 해시(integrity)는 어떻게 만드나요?
sha384- + 파일 바이트의 SHA-384를 표준 Base64로 인코딩한 문자열입니다. 파일 탭에 스크립트 파일을 넣으면 SRI 행에 그대로 나옵니다. 텍스트 탭에서 SHA-384 + Base64로 만들 수도 있지만, 붙여넣으면서 줄바꿈(CRLF→LF)이 바뀌면 실제 파일과 값이 달라지므로 파일 탭이 안전합니다. 사용할 때는 script·link 태그에 integrity="sha384-…"와 crossorigin="anonymous" 속성을 함께 추가합니다 — 다른 출처(CDN)의 파일은 CORS 응답 헤더가 있어야 검증이 되고, 없으면 로드 자체가 실패합니다.hex와 Base64 중 무엇을 써야 하나요?
integrity 값이 이 형식입니다. Base64URL은 +→-, /→_로 바꾸고 끝의 =를 뺀 형태(SHA-256 = 43자)로 JWT 서명(RFC 7515)이 씁니다. 비교할 때는 형식부터 맞추세요 — hex 값과 Base64 값은 같은 해시여도 문자열로는 절대 일치하지 않습니다.해시 충돌(collision)이란 무엇인가요?
참고 자료
- NIST FIPS 180-4 (SHS)(새 창)nvlpubs.nist.gov
- NIST SHA-1 퇴역 발표(새 창)nist.gov
- RFC 2104 (HMAC)(새 창)rfc-editor.org
- W3C Subresource Integrity(새 창)w3.org
- 계산 기준
- MD5 RFC 1321 · SHA-1/SHA-2 NIST FIPS 180-4 · HMAC RFC 2104 · SRI W3C 권고 · NIST SHA-1 퇴역 발표(2022.12)
- 오류 제보
- 결과가 다르면 contact@youtil.kr로 입력 조건을 알려 주세요. 평일 기준 1~3일 안에 답변합니다.