MD5·SHA-1·SHA-256 차이와 비밀번호 저장 주의점
2026.10.03 업데이트 · 6분 읽기
MD5·SHA-1·SHA-256은 해시 길이와 충돌 안전성이 다릅니다. 파일 체크섬과 서명에는 무엇을 쓰는지, 비밀번호 저장에는 왜 SHA-256도 안 되고 bcrypt·Argon2 같은 전용 함수가 필요한지 정리했습니다.
해시 생성 (MD5·SHA) 바로 사용하기MD5·SHA-1·SHA-256은 모두 입력을 짧은 고정 길이 값으로 바꾸지만 서로 바꿔 쓸 수 있는 것은 아닙니다. MD5·SHA-1은 충돌이 알려져 있어 서명·비밀번호 저장에 쓰지 않습니다. 비밀번호 저장에는 bcrypt·scrypt·Argon2 같은 전용 함수를 씁니다. 체크섬과 서명에는 SHA-256이 무난한 기본값입니다. 해시값은 해시 생성 (MD5·SHA)에서 텍스트를 붙여 넣거나 파일을 열어 나란히 볼 수 있습니다.
한눈에 비교
| 항목 | MD5 | SHA-1 | SHA-256 | SHA-512 |
|---|---|---|---|---|
| 명세 | RFC 1321 | FIPS 180-4 | FIPS 180-4 | FIPS 180-4 |
| 해시 길이 | 128비트 | 160비트 | 256비트 | 512비트 |
| 16진수 표기 | 32자 | 40자 | 64자 | 128자 |
| 충돌 | 발견됨, 빠르게 만들 수 있음 | 발견됨 | 공개된 것 없음(전체 라운드) | 공개된 것 없음(전체 라운드) |
| 현재 위치 | 서명에 쓰지 않음(RFC 6151) | 2030년 말까지 단계적 퇴출 | SHA-2 계열 | SHA-2 계열 |
같은 여섯 글자를 세 알고리즘에 넣은 결과입니다.
입력: ZEKILO
MD5 f36f86467ce6ba1a1063f6e7019d5e6d
SHA-1 42d40f3480e77ccf59395369cc957ec5a2bf7c4b
SHA-256 f1dfccaf4a395154a1b494c0f0e068765a099f596f3e79934dcc98a2fda67f26
같은 바이트는 언제나 같은 해시가 되고, 조금만 달라도 전혀 다른 값이 나옵니다. 소문자 zekilo의 SHA-256은 fef1d7d382d3b5d9f0c91e96273a8e4c7f446805b4a08bbb625dc2f742b4177b입니다. 입력 끝의 줄바꿈도 해시에 들어가므로, 「같은 글」인데 해시가 다르다면 줄바꿈부터 확인하세요.
해시가 보장하려는 것
RFC 6151은 메시지 다이제스트 알고리즘이 갖추어야 할 성질을 세 가지로 듭니다.
- 충돌 저항성: 해시가 같은 서로 다른 두 입력을 찾기 어려워야 합니다.
- 역상 저항성: 해시만 보고 그 해시가 나오는 입력을 찾기 어려워야 합니다.
- 제2 역상 저항성: 주어진 입력과 해시가 같은 다른 입력을 찾기 어려워야 합니다.
해시는 암호화가 아닙니다. 키가 없고, OWASP 문서의 표현대로 한 방향으로만 계산되는 함수입니다. 후보 입력의 해시와 비교하는 것만 가능합니다.
MD5와 SHA-1에서 무너진 것
MD5. 2011년 3월에 나온 RFC 6151은 2006년에 발표된 방법으로 일반 노트북에서 약 1분이면 MD5 충돌을 찾을 수 있고, 충돌 공격이 X.509 인증서에도 적용되었다고 정리합니다. 결론은 전자서명처럼 충돌 저항성이 필요한 곳에 MD5를 더는 쓸 수 없다는 것입니다. 같은 문서는 알려진 역상 공격의 복잡도가 2^123.4로 여전히 높다고 적고 있어, 문제는 해시를 원문으로 되돌리는 쪽이 아니라 충돌 쪽입니다.
SHA-1. NIST는 2022년 12월 15일에 SHA-1을 2030년 12월 31일까지 단계적으로 퇴출하고 SHA-2·SHA-3 계열로 옮기라고 발표했습니다. 최근 몇 년 사이 충돌 공격이 SHA-1의 안전성을 무너뜨리는 데 쓰였다는 설명도 함께 있습니다.
충돌이 문제가 되는 이유는 서명 때문입니다. 해시가 같은 문서 두 개를 미리 만들 수 있다면 한쪽에 한 서명이 다른 쪽에도 그대로 유효합니다. 그래서 서명과 인증서에는 충돌이 알려지지 않은 SHA-256 같은 SHA-2·SHA-3 계열을 씁니다.
비밀번호 저장에는 모두 쓰면 안 되는 이유
이것은 충돌과 별개의 문제이고 SHA-256에도 똑같이 해당합니다. 범용 해시는 빠르게 계산되도록 만들어졌습니다. OWASP는 SHA-256 같은 빠른 해시는 공격자가 짧은 시간에 매우 많은 추측을 시도할 수 있게 하므로 비밀번호 저장에 알맞지 않다고 명시합니다. 게다가 솔트 없이 저장하면 같은 비밀번호는 같은 해시가 됩니다.
비밀번호 저장 전용 함수는 이 점을 반대로 설계했습니다.
- 일부러 느리게 계산하고, 하드웨어가 좋아지면 작업량(work factor)을 올릴 수 있습니다. Argon2id와 scrypt는 메모리도 정한 만큼 쓰게 합니다.
- 비밀번호마다 다른 무작위 값인 솔트를 섞어, 같은 비밀번호도 다른 결과가 되고 미리 계산해 둔 표를 쓸 수 없게 합니다. OWASP에 따르면 널리 쓰이는 라이브러리 대부분이 솔트를 자동으로 만들고 관리합니다.
2026년 10월 기준 OWASP가 권하는 최소 설정입니다.
| 함수 | OWASP 권장 최소 설정 |
|---|---|
| Argon2id | 메모리 19 MiB, 반복 2회, 병렬도 1 |
| scrypt | 비용 매개변수 2^17, 블록 크기 8, 병렬화 1 |
| bcrypt | work factor 10 이상, 비밀번호 72바이트 제한 |
| PBKDF2-HMAC-SHA-256 | 60만 회 이상 반복(FIPS-140 준수가 필요한 시스템) |
실무에서는 SHA-256을 직접 반복해 구현하지 말고, 쓰는 언어나 프레임워크의 비밀번호 해시 API를 호출하세요. OWASP의 우선순위는 Argon2id, 쓸 수 없으면 scrypt, 기존 시스템이라면 bcrypt입니다.
사용자 쪽에서는 길고 무작위인 비밀번호가 추측 여지를 크게 줄입니다. 비밀번호 생성의 기본값(94종 문자, 16자)은 엔트로피가 약 104.9비트입니다. 생성한 비밀번호는 기록하지 않습니다. 비밀번호 관리자에 바로 저장하세요.
용도별로 고르기
| 용도 | 쓸 것 |
|---|---|
| 내려받은 파일의 체크섬 대조 | SHA-256 |
| 전자서명·인증서 | SHA-256 등 SHA-2·SHA-3 계열 |
| 공유 비밀 키로 메시지 인증 | HMAC-SHA-256 |
| 비밀번호 저장 | Argon2id·scrypt·bcrypt |
| 속이려는 사람이 없는 단순 변경 확인 | 무엇이든 가능, SHA-256 권장 |
직접 확인해 볼 수 있는 기준 값도 있습니다. 내용이 abc 세 바이트뿐이고 줄바꿈이 없는 파일의 SHA-256은 ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad이고, ZEKILO를 키 zekilo-secret으로 계산한 HMAC-SHA-256은 685de252cb7c60a51aedb9b4c14903d26efb4bb2a11c31531f4388f0badc270f입니다. HMAC은 키를 함께 섞기 때문에 키를 아는 쪽만 같은 값을 만들 수 있습니다.
체크섬은 내 파일이 비교한 값과 같다는 것만 알려 줍니다. 체크섬을 파일과 같은 곳에서 받았다면 전송 중 손상은 잡아내도, 누군가 일부러 바꿔 놓은 경우는 가려내지 못합니다.
ZEKILO Dev로 확인하기
- 해시 생성 (MD5·SHA)에 텍스트를 입력하거나 붙여 넣고, 파일은 열거나 놓습니다.
- MD5·SHA-1·SHA-256·SHA-384·SHA-512가 함께 표시됩니다. 출력은 16진수 소문자·대문자·Base64 중에서 고르고, HMAC을 켜면 키를 입력할 수 있습니다.
- 내려받은 파일을 검증할 때는 비교 탭에 기대하는 해시를 붙여 넣습니다. 대소문자는 구분하지 않습니다.
텍스트와 파일은 브라우저 안에서 계산하며 서버로 보내지 않습니다.
정리
- MD5(128비트)와 SHA-1(160비트)은 충돌이 알려져 있습니다. 서명·인증서에 쓰지 마세요.
- 체크섬·서명·HMAC에는 SHA-256이 무난한 기본값입니다.
- SHA-256을 포함한 범용 해시는 빠르게 계산되므로 비밀번호 저장에 알맞지 않습니다. 솔트가 포함된 Argon2id·scrypt·bcrypt를 씁니다.
- 해시는 한 방향 계산이라 암호화와 다르고, 줄바꿈 하나만 달라도 값이 달라집니다.