해시 함수 한눈에: 한쪽으로만 가는 계산

설치 파일을 내려받는 페이지에는 가끔 SHA-256 이라는 이름과 함께 64글자짜리 영문·숫자 줄이 적혀 있습니다 [S2]. 제대로 만든 웹사이트는 내 비밀번호를 그대로 적어 두지 않고, 알아볼 수 없는 다른 값으로 바꿔 저장합니다 [S11]. 둘 다 해시 함수가 만든 값입니다. 해시 함수가 무엇을 약속하는지, 쓸 때 부담은 무엇인지, 언제 무엇을 고르는지 봅니다.

한쪽으로만 가는 함수

해시 함수는 아무 길이의 데이터를 받아 늘 같은 길이의 짧은 값을 내놓습니다 [S1]. 같은 데이터를 넣으면 언제나 같은 값이 나옵니다. 그 결과를 해시 값이라고 합니다.

여러 문서와 파일이 곡선을 따라 톱니바퀴가 그려진 상자로 들어가고, 반대편으로 지문 모양의 파란 격자 하나가 나온다. 격자에서 문서로 돌아가는 점선 화살표는 ✕ 로 막혀 있다.

내려받은 파일이 원본과 같은지 확인할 때도 해시 값을 씁니다. 받은 파일의 해시 값을, 믿을 만한 곳에 공개된 해시 값과 견주면 됩니다 [S2].

직접 보기

한 비트만 바뀌어도 해시 값은 몰라볼 만큼 달라집니다 [S3]. 한 글자씩 바꾸며 확인해 보세요.

질문: 한 글자만 바꾸면 해시 값의 몇 비트가 바뀔까?
직전 해시 값
지금 해시 값

바뀐 비트:

SHA-256 이면 평균 절반인 128비트쯤 바뀝니다 (계산). 위에서 다른 해시 함수도 골라 보세요. 비슷한 글끼리도 해시 값은 닮은 데가 거의 없어서, 해시 값을 보고 원래 글을 짐작할 단서가 없습니다. 게다가 해시 값에서 원래 글을 계산해 되돌리는 방법도 없어서, 찾으려면 글을 하나씩 넣어 보는 수밖에 없습니다. 이것이 단방향입니다 [S4].

질문: 해시 값의 앞 몇 자리만 맞는 글을 찾으려면 몇 번 찍어야 할까?

목표: «» 의 해시 값 — 앞 몇 자리만 맞춰 봅니다

«찾기» 를 누르면 번호를 바꿔 가며 찍습니다.

기대 횟수 내 기록 평균 (로그 눈금)
몇 번만 하면 운에 따라 평균이 크게 흔들립니다. 여러 번 눌러 보세요.

해시 값은 16진수로 쓰니, 맞출 자리가 하나 늘 때마다 시도가 16배가 됩니다. 64자리 전부라면 2256번, 약 1.16×1077번입니다 [S3] [S14]. 여기까지 세 가지를 짚어 보세요. 같은 글이면 같은 값(위 «같은 글 다시 계산»), 한 글자만 달라도 통째로 다른 값(한 글자 바꾸기), 값에서 글로는 하나씩 찍어 보는 수밖에 없음(원문 찾기).

해시 함수 비교

표 1. 자주 쓰이는 해시 함수. 속도는 이 글을 쓴 컴퓨터에서 잰 값 (측정 조건).
해시 함수해시 값 길이속도지금주로 어디에
SHA-256256비트2,437 MB/s✓ 써도 됨파일 확인, 디지털 서명 [S1]
SHA-512512비트1,422 MB/s✓ 써도 됨SHA-256 과 같은 쓰임, 더 긴 해시 값 [S1]
SHA3-256256비트897 MB/s✓ 써도 됨SHA-2 무리의 대안 [S5]
BLAKE2b최대 512비트1,041 MB/s✓ 써도 됨빠른 범용 해시 함수 [S6]
SHA-1160비트2,366 MB/s✕ 피함옛 시스템 — 2017년 실제 충돌, 2030년까지 퇴출 [S7]
MD5128비트694 MB/s✕ 피함옛 시스템 — 충돌 공격이 알려짐 [S8]
CRC-3232비트26,213 MB/s– 보안용 아님우연한 전송 오류 검사 [S9]
Argon2id설정 (보통 256비트)한 번 약 0.1초✓ 써도 됨비밀번호 저장 [S10]

부담과 의미

파일을 확인할 때는 부담이 거의 없습니다. SHA-256 은 1초에 2GB 넘게 처리했습니다. 오래된 MD5 보다도 빨랐습니다. 많은 컴퓨터가 SHA-256 을 하드웨어로 지원하기 때문으로 보입니다 [S3].

그림 1. 1초에 처리하는 양. 눈금 한 칸이 10배인 로그 눈금이며, 숫자는 표 1 과 같습니다.

비밀번호를 저장할 때는 그 빠름이 독입니다. 저장된 해시 값을 훔친 사람은 후보를 하나씩 해시 함수로 계산해 견줍니다 [S12]. 그래서 비밀번호는 일부러 느린 비밀번호 해싱으로, 사람마다 다른 솔트를 붙이고 반복 횟수(cost)를 높여 저장해야 합니다 [S11].

그림 2. 비밀번호 후보 1억 개를 모두 시험하는 시간 (한 코어 기준, 측정값에서 계산). Argon2id 는 권장 설정 중 하나(64MiB·3번·4갈래)이고, 네 갈래가 쓴 CPU 시간을 합쳐 한 코어로 셌습니다 [S10].

로그인하는 사람은 한 번만 계산하니 0.1초쯤이면 그만입니다. 하지만 후보 1억 개를 시험하는 사람에게는 SHA-256 으로 1분 반이면 될 일이 Argon2id 로는 넉 달 넘게 걸립니다 (계산).

질문: 내 기기의 해시 함수는 1초에 얼마나 처리할까?

브라우저에 들어 있는 해시(SHA-1·SHA-256·SHA-512)와 PBKDF2 로 잽니다.

무엇을 고를까

아래 표를 보기 전에 먼저 골라 보세요. 파일 확인, 비밀번호 저장, 우연한 전송 오류 검사에는 각각 무엇을 쓸까요? 표 1 의 «주로 어디에» 칸이 단서입니다.

표 2. 상황별로 고르기
하려는 일고를 것이유
파일·다운로드 확인SHA-256빠르고, 지금 안전하다 [S1] [S5]
비밀번호 저장Argon2id + 솔트일부러 느리고 메모리를 많이 써서 후보를 시험하는 비용이 크다 [S10] [S11]
우연한 전송 오류만 잡기CRC-32가장 빠르다 (표 1). 누군가 일부러 바꾸는 것은 막지 못한다 [S9]
새로 만드는 시스템MD5·SHA-1 쓰지 않기충돌을 만들 수 있다 [S8] [S7]
이 글의 계산과 측정

표 1 과 그림 1·2 의 숫자는 이 글을 쓴 컴퓨터에서 잰 값입니다. 측정에는 Apple M1 Max · Node v24.21.0 · OpenSSL 3.5.8 · 2026-10-04에 약 268MB(2²⁸ 바이트) 무작위 데이터를 사용했고, 3번 중 가장 빠른 값을 적었습니다. 기기마다 값이 다릅니다. 위 «재기» 로 내 기기 값을 볼 수 있습니다.

그림 2 의 시간은 측정값에서 계산했습니다. 한 코어 기준으로 SHA-256 은 짧은 글을 1초에 약 108만 번, Argon2id 는 한 번에 약 109ms 입니다. SHA-256 은 Node 에서 한 번씩 불러 잰 값이라 부르는 비용이 섞여 있어, 계산만 따지면 더 빠릅니다. Argon2id 는 네 갈래를 동시에 돌리므로 스톱워치 시간이 아니라 네 갈래가 쓴 CPU 시간을 합쳐 셌고, 둘 다 여러 번 재어 가운데 값을 썼습니다 (2026-10-05). 공격자는 여러 코어와 전용 장비를 쓰므로 실제로는 더 빠를 수 있습니다.

시뮬레이터의 해시 함수 7개는 표준 문서([S1] [S5] [S6] [S13])를 옮겨 이 글을 위해 직접 짠 교육용 코드입니다. 실제 보안에 쓰지 마세요. 표준의 예제 값, 그리고 Node 의 OpenSSL·zlib 결과와 해시 함수마다 516개씩 맞춰 확인했습니다. 평균 절반의 비트가 바뀌는 것과 16n번도 이 검증으로 확인했습니다.

출처

  1. [S1] NIST FIPS 180-4, Secure Hash Standard (2015)
  2. [S2] Ubuntu — How to verify your Ubuntu download
  3. [S3] NIST IR 8202, Blockchain Technology Overview (2018) §3.1
  4. [S4] NIST SP 800-107 Rev. 1 (2012) §4.1
  5. [S5] NIST FIPS 202, SHA-3 Standard (2015) · NIST CSRC — Hash Functions
  6. [S6] RFC 7693, The BLAKE2 Cryptographic Hash and MAC (2015)
  7. [S7] Stevens 외, The first collision for full SHA-1 (2017) · NIST Retires SHA-1 (2022)
  8. [S8] RFC 6151, MD5 and HMAC-MD5 Security Considerations (2011)
  9. [S9] RFC 3385, iSCSI CRC/Checksum Considerations (2002) §10
  10. [S10] RFC 9106, Argon2 Memory-Hard Function for Password Hashing (2021)
  11. [S11] NIST SP 800-63B (Rev. 4)
  12. [S12] RFC 8018, PKCS #5 v2.1 (2017) §4
  13. [S14] Menezes 외, Handbook of Applied Cryptography 9장 (Fact 9.33)
  14. [S13] RFC 1321, The MD5 Message-Digest Algorithm (1992)