해시 생성기·HMAC·파일 체크섬

텍스트 해시·HMAC 생성, 파일 체크섬 검증

텍스트 해시·HMAC 생성, 파일 체크섬 검증

0 자
MD5—
SHA-1—
SHA-256—
SHA-512—

해시 생성기·HMAC·파일 체크섬 소개

이 도구에는 세 가지 모드가 있습니다. 텍스트 해시 모드는 입력 문자열을 UTF-8 바이트로 바꾼 뒤 MD5, SHA-1, SHA-256, SHA-512를 한꺼번에 계산합니다. HMAC 모드는 비밀 키와 메시지로 HMAC-SHA-1/256/384/512를 만들어 16진수나 Base64로 보여 줍니다. 파일 체크섬 모드는 파일을 8MB 조각으로 나눠 읽으면서 CRC32, MD5, SHA-1, SHA-256, SHA-384, SHA-512 중 고른 것을 동시에 계산하고, 붙여 넣은 기대값과 비교합니다.

세 모드는 같은 재료(해시 함수)를 쓰지만 답하는 질문이 다릅니다. 파일 체크섬은 「받은 파일이 원본과 같은가」, HMAC은 「이 메시지를 키를 가진 사람이 만들었고 도중에 바뀌지 않았는가」를 묻습니다. 평범한 해시 하나로는 두 번째 질문에 답할 수 없고, 어느 것도 비밀번호 저장용은 아닙니다.

해시값은 바이트 하나만 달라도 전부 바뀐다

해시 함수는 입력 길이와 상관없이 고정 길이 값을 냅니다. MD5는 128비트(16진수 32자), SHA-1은 160비트(40자), SHA-256은 256비트(64자), SHA-512는 512비트(128자)입니다. 입력이 조금만 달라도 결과는 예측할 수 없을 만큼 바뀝니다. 「hello」와 「Hello」의 SHA-256은 첫 글자부터 다릅니다.

같은 글자처럼 보여도 바이트가 다르면 해시가 다릅니다. 가장 흔한 원인은 줄바꿈입니다. 터미널에서 echo hello | md5sum을 하면 echo가 끝에 줄바꿈(\n)을 붙여서 b1946ac9…가 나오고, 이 도구에 hello만 넣으면 5d41402a…가 나옵니다. 윈도우 메모장의 CRLF, 복사할 때 딸려 온 공백, 한글의 NFC/NFD 정규화 차이(macOS 파일명에서 자주 생김)도 같은 문제를 만듭니다.

MD5와 SHA-1은 「깨졌다」 — 그런데 무엇이 깨졌나

해시 함수에 요구하는 성질은 셋입니다. 해시값만 보고 원문을 찾을 수 없어야 하고(역상 저항), 주어진 파일과 같은 해시를 갖는 다른 파일을 만들 수 없어야 하며(제2역상 저항), 해시가 같은 아무 두 입력도 찾을 수 없어야 합니다(충돌 저항). MD5와 SHA-1이 무너진 것은 세 번째입니다.

MD5 충돌은 2004년 왕샤오윈(Wang Xiaoyun) 연구팀이 발표했고, RFC 6151(2011)은 2006년 무렵 이미 노트북에서 1분 안에 충돌을 찾을 수 있었다고 적습니다. SHA-1은 2017년 2월 CWI 암스테르담과 Google이 SHAttered 공격으로 SHA-1 해시가 같은 PDF 두 개를 공개했습니다. 약 900경(9×10^18) 번의 SHA-1 계산, CPU 6,500년·GPU 110년 분량이 들었습니다. 2020년에는 Leurent와 Peyrin이 두 입력의 앞부분을 공격자가 마음대로 정할 수 있는 선택 접두 충돌을 약 7만 5천 달러어치 GPU 임대로 보여 주었습니다. NIST는 2022년 12월 SHA-1을 2030년 12월 31일까지 퇴출하라고 발표했습니다.

충돌 공격은 공격자가 두 파일을 모두 만들 수 있을 때 위험합니다. 예를 들어 무해한 계약서와 불리한 계약서를 같은 해시로 만들어 앞의 것에 서명을 받는 식입니다. 반면 이미 배포된 파일과 같은 해시를 갖는 가짜 파일을 새로 만드는 일(제2역상)은 MD5에서도 실용적인 방법이 알려져 있지 않습니다. 그래서 「다운로드 중 파일이 깨졌는지」 확인하는 데 MD5를 쓰는 것은 지금도 문제가 없고, 「배포자가 악의적일 수 있는 상황에서 진본을 보증」하는 데는 SHA-256을 써야 합니다.

파일 체크섬 모드: 무엇을 확인하고 무엇을 확인하지 못하나

배포 페이지의 SHA256SUMS 파일 내용을 그대로 붙여 넣어도 됩니다. 도구는 GNU 형식(해시 두 칸 공백 파일명), BSD 형식(SHA256 (파일명) = 해시)을 읽고, 여러 줄이면 선택한 파일명과 같은 줄을 먼저 고릅니다. 태그가 없으면 길이로 알고리즘을 추정합니다(8자 CRC32, 32자 MD5, 40자 SHA-1, 64자 SHA-256, 96자 SHA-384, 128자 SHA-512).

체크섬이 일치하면 「이 페이지에 적힌 값과 같은 파일을 받았다」는 뜻입니다. 공격자가 다운로드 서버를 장악해 파일과 체크섬을 함께 바꿨다면 여전히 일치합니다. 그래서 리눅스 배포판은 SHA256SUMS 자체에 GPG 서명을 붙이고, 서명 검증까지 해야 출처가 확인됩니다. 이 도구는 해시 비교까지만 합니다.

CRC32는 암호학적 해시가 아닙니다. ZIP, PNG, 이더넷 프레임에서 전송 오류를 잡으려고 쓰는 오류 검출 코드이고, 원하는 CRC32 값을 갖도록 파일 끝 4바이트를 조정하는 것은 간단한 계산입니다. 우연한 손상 확인용으로만 보세요.

HMAC 모드: 왜 SHA-256(키+메시지)로는 안 되나

API 요청 서명이나 웹훅 검증에 「비밀 키를 메시지 앞에 붙여 해시하면 되지 않나」 싶지만, MD5·SHA-1·SHA-256처럼 머클-담고르 구조인 해시는 길이 확장 공격에 걸립니다. 해시 결과가 곧 마지막 내부 상태라서, H(키‖메시지)와 메시지 길이만 알면 키를 몰라도 H(키‖메시지‖패딩‖추가데이터)를 계산할 수 있습니다. 「amount=100」 뒤에 「&amount=9999」를 붙인 요청의 유효한 서명을 위조할 수 있다는 뜻입니다.

HMAC(RFC 2104)은 키를 두 번, 서로 다른 패딩(ipad 0x36, opad 0x5c)과 섞어 안쪽·바깥쪽으로 두 번 해시합니다. 바깥 해시가 안쪽 결과를 감싸기 때문에 길이 확장이 통하지 않습니다. 같은 이유로 HMAC-MD5·HMAC-SHA-1은 충돌 공격의 영향을 거의 받지 않지만, RFC 6151은 새 프로토콜에는 HMAC-MD5를 넣지 말라고 권합니다.

이 도구의 키 입력은 텍스트를 UTF-8로 바꾼 값입니다. 서비스가 키를 16진수나 Base64 문자열로 준 경우, 그 문자열을 디코딩한 바이트가 키인지 문자열 그대로가 키인지는 서비스 문서마다 다르니 먼저 확인하세요. 키가 블록 크기(SHA-256은 64바이트, SHA-384/512는 128바이트)보다 길면 규격에 따라 먼저 해시된 뒤 쓰입니다.

비밀번호를 여기서 해시해 저장하면 안 되는 이유

MD5와 SHA 계열은 빠르게 설계됐습니다. 파일 검증에는 장점이지만 비밀번호에는 단점입니다. 유출된 해시를 가진 공격자가 초당 수많은 후보를 시험할 수 있기 때문입니다. 「password」의 MD5인 5f4dcc3b5aa765d61d8327deb882cf99는 검색만 해도 원문이 나옵니다. 비밀번호 저장에는 솔트와 비용 인자가 있는 bcrypt, scrypt, Argon2를 씁니다.

예시

줄바꿈 하나 차이

입력
텍스트 모드, MD5: hello / hello + 줄바꿈
결과
5d41402abc4b2a76b9719d911017c592 / b1946ac92492d2347c6235b4d2611184

두 번째 값은 리눅스에서 echo hello | md5sum을 실행했을 때와 같습니다. 서버에서 계산한 값과 다르면 먼저 끝의 줄바꿈과 공백을 의심하세요.

HMAC-SHA256 표준 예시

입력
키: key / 메시지: The quick brown fox jumps over the lazy dog
결과
hex f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8 / Base64 97yD9DBThCSxMpjmqm+xQ+9NWaFJRhdZl0edvC0aPNg=

같은 입력을 텍스트 모드에서 「keyThe quick…」로 이어 SHA-256하면 51729876…가 나옵니다. 키를 앞에 붙인 해시와 HMAC은 전혀 다른 값입니다.

ISO 파일 검증

입력
파일 체크섬 모드에 내려받은 ISO를 넣고, 배포 페이지의 SHA256SUMS 여러 줄을 그대로 붙여 넣기
결과
파일명과 같은 줄의 64자 값을 골라 SHA-256으로 비교, 일치/불일치 표시

수 GB 파일도 8MB씩 읽어 메모리를 적게 씁니다. 불일치라면 다운로드가 중단됐거나 다른 버전을 받았을 가능성이 높습니다.

사용 방법

  1. 상단 탭에서 텍스트 해시, HMAC, 파일 체크섬 중 하나를 고릅니다.
  2. 텍스트나 키·메시지를 입력하거나 파일을 끌어다 놓습니다.
  3. 파일 체크섬 모드라면 배포처가 공개한 체크섬을 붙여 넣어 비교합니다.
  4. 결과 옆 복사 버튼으로 값을 가져갑니다.

주요 용어

충돌(collision)
서로 다른 두 입력이 같은 해시를 갖는 것. 공격자가 두 입력을 모두 고를 수 있으면 MD5·SHA-1에서 실제로 만들 수 있습니다.
길이 확장 공격
H(비밀‖메시지)만 알 때 비밀을 모르고도 메시지 뒤에 데이터를 덧붙인 해시를 계산하는 공격. HMAC이나 SHA-3에는 통하지 않습니다.
CRC32
전송 오류 검출용 32비트 코드. 암호학적 보장이 없습니다.

자주 묻는 질문

MD5 해시를 되돌려 원문을 알 수 있나요?

수학적으로 되돌리는 방법은 없습니다. 다만 짧거나 흔한 원문은 후보를 대량으로 해시해 맞춰 보는 방식으로 찾을 수 있습니다. 같은 사이트의 해시 역산기가 그렇게 동작합니다.

SHA-256과 SHA-512 중 무엇을 써야 하나요?

보안 수준은 둘 다 충분합니다. 다른 시스템과 비교해야 한다면 상대가 쓰는 것을 따르세요. 체크섬 파일은 SHA-256이 가장 흔합니다.

사이트에 적힌 체크섬과 대문자·소문자가 다릅니다.

16진수는 대소문자를 구분하지 않습니다. 도구는 소문자로 바꿔 비교합니다.

파일 체크섬 모드에서 SHA-512도 확인할 수 있나요?

네. 파일 모드는 CRC32, MD5, SHA-1, SHA-256, SHA-384, SHA-512를 지원합니다. SHA512SUMS 내용을 붙여 넣으면 길이(128자)로 알아보고 SHA-512를 자동으로 켭니다. 다만 브라우저에서 직접 구현한 SHA-512는 SHA-256보다 서너 배 느려서, 수 GB 파일이면 1분 넘게 걸릴 수 있습니다.

웹훅 서명 검증이 계속 실패합니다.

대개 메시지가 서버가 서명한 원본 바이트와 다릅니다. JSON을 파싱했다가 다시 문자열로 만들면 공백과 키 순서가 바뀌므로, 받은 원문 그대로 넣어야 합니다.

관련 가이드

출처

기준일:

개인정보와 저장 방식