SHA-256 해시 생성기 쉽게 이해하기 — 개념과 원리
SHA-256은 어떤 입력이든 256비트, 즉 16진수 64자리의 고정된 지문으로 바꾸는 해시 함수입니다. 이 도구는 입력한 글을 UTF-8로 바꾼 뒤 브라우저 안에서만 해시를 계산합니다. SHA-256은 내려받은 파일의 무결성 확인, 파일과 커밋 식별, 인증서·전자서명, 블록체인, HMAC 같은 다른 암호 구조의 부품으로 널리 쓰입니다.
계산 방법
FIPS 180-4 표준을 따릅니다.
- 부호화: 글을 UTF-8 바이트열로 바꿉니다.
- 덧붙이기: 0x80 한 바이트를 붙이고, 길이가 64의 배수보다 8바이트 모자랄 때까지 0을 채운 뒤, 원래 길이(비트)를 64비트 빅엔디언으로 붙입니다.
- 블록 처리: 64바이트(512비트) 블록마다 32비트 단어 64개로 확장하고, 덧셈·회전·비트 함수를 64라운드 반복해 8개 단어의 상태값에 섞습니다.
- 출력: 마지막 32비트 단어 8개를 16진수로 이어 쓴 것이 해시값입니다.
초기값과 라운드 상수는 작은 소수들의 제곱근·세제곱근의 소수 부분에서 가져온 값이라, 숨겨진 뒷문을 넣을 여지가 없습니다.
원리
암호학적 해시는 거꾸로 되돌리기 어렵고(일방향성), 같은 값을 내는 두 입력을 찾기 어렵게(충돌 저항성) 설계됩니다. 입력이 1비트만 바뀌어도 출력 비트의 약 절반이 바뀌는 눈사태 효과 덕분에 결과는 무작위처럼 보입니다. 주어진 해시의 원래 입력을 찾는 데는 약 2^256번, 충돌을 찾는 데는 생일 문제에 따라 약 2^128번의 계산이 필요하며, 공개된 실용적 공격은 없습니다.
예제 풀이
- 입력: "hello", UTF-8 바이트 68 65 6c 6c 6f(5바이트, 40비트)
- 덧붙이기: 5바이트 + 0x80 + 0 50바이트 + 길이 0x28(8바이트) = 64바이트 블록 1개
- 64라운드 뒤 결과: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
- "Hello"로 바꾸면 전혀 다른 값이 나옵니다.
결과 해석
입력 길이와 상관없이 결과는 항상 16진수 64자리입니다. 두 해시를 비교할 때는 앞 몇 자리만 보지 말고 전체를 비교해야 합니다. 끝의 공백이나 줄바꿈, 유니코드 정규화 차이만으로도 해시가 달라집니다.
흔한 실수
- 해시를 '복호화'할 수 있다고 생각하는 경우. 해시는 암호화가 아닙니다.
- 비밀번호를 SHA-256 한 번으로 저장하는 경우. Argon2id·bcrypt·PBKDF2 같은 느린 해시를 써야 합니다.
- echo 명령이 붙인 줄바꿈 때문에 터미널 결과와 달라지는 경우
자주 묻는 질문
SHA-256과 SHA-2는 같은 건가요?
SHA-2는 SHA-224·SHA-256·SHA-384·SHA-512 등을 묶은 계열이고, SHA-256은 그중 256비트 버전입니다.
서로 다른 글이 같은 해시를 가질 수 있나요?
이론적으로는 가능하지만, 지금까지 실제로 발견된 충돌은 없습니다.
입력한 글이 서버로 전송되나요?
아닙니다. 해시는 브라우저 안에서 계산됩니다.
출처: NIST FIPS 180-4, Secure Hash Standard (SHS) · RFC 6234, US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)