보안

해시 함수 쉽게 이해하기: MD5, SHA-1, SHA-256의 차이와 올바른 사용법

소프트웨어 다운로드 페이지의 SHA-256 체크섬, Git 커밋 ID, 블록체인 주소까지 모두 해시 함수의 결과입니다. 해시가 암호화와 어떻게 다른지, 어떤 알고리즘을 언제 골라야 하는지 정리합니다.

해시 함수란 무엇인가

해시 함수는 길이가 제각각인 입력을 받아 항상 같은 길이의 짧은 값(해시값, 다이제스트)을 만들어 내는 함수입니다. 한 글자짜리 문장이든 수 GB짜리 동영상이든 SHA-256에 넣으면 결과는 언제나 256비트, 16진수로 64글자입니다.

중요한 점은 해시가 '일방향'이라는 것입니다. 해시값에서 원래 입력을 계산해 되돌리는 방법이 없습니다. 이 점이 키만 있으면 원문을 복원할 수 있는 암호화, 그리고 누구나 되돌릴 수 있는 Base64와의 결정적인 차이입니다.

좋은 해시 함수의 세 가지 성질

보안용으로 쓰이는 암호학적 해시 함수는 다음 성질을 만족해야 합니다.

  • 결정성: 같은 입력은 언제 어디서 계산해도 같은 해시값을 냅니다.
  • 눈사태 효과: 입력이 한 글자만 달라도 결과가 완전히 달라집니다. 아래 예시처럼 hello와 hello!의 해시는 비슷한 구석이 전혀 없습니다.
  • 충돌 저항성: 서로 다른 두 입력이 같은 해시값을 갖도록 만드는 것이 현실적으로 불가능해야 합니다.
SHA-256("hello")  = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
SHA-256("hello!") = ce06092fb948d9ffac7d1a376e404b26b7575bcc11ee05a4615fef4fec3a308b
MD5("hello")      = 5d41402abc4b2a76b9719d911017c592

대소문자도 다른 입력입니다. Hello와 hello는 해시값이 완전히 다르므로, 해시를 비교할 때는 입력의 공백, 줄바꿈, 대소문자까지 정확히 같은지 먼저 확인해야 합니다.

MD5, SHA-1, SHA-256 무엇이 다른가

MD5는 128비트(16진수 32글자) 결과를 내는 오래된 알고리즘입니다. 계산이 빠르지만 2004년 이후 충돌을 쉽게 만드는 공격이 알려져 보안 용도로는 쓰면 안 됩니다. 다만 우연한 파일 손상을 확인하는 단순 체크섬 용도로는 아직 쓰입니다.

SHA-1은 160비트 결과를 냅니다. 2017년 구글과 CWI 연구팀이 실제로 같은 SHA-1 값을 갖는 서로 다른 PDF 두 개를 만들어 공개(SHAttered)하면서 보안 용도에서는 퇴출되었습니다. 주요 브라우저와 인증 기관도 SHA-1 인증서를 더 이상 신뢰하지 않습니다.

SHA-256은 SHA-2 계열에 속하며 256비트 결과를 냅니다. 현재 소프트웨어 배포 체크섬, TLS 인증서, 블록체인 등에서 표준처럼 쓰이며, 새로 시스템을 만든다면 기본 선택지는 SHA-256 이상입니다.

파일 무결성 확인: 체크섬 사용법

오픈소스 프로그램 다운로드 페이지에는 종종 SHA-256 값이 함께 적혀 있습니다. 내려받은 파일의 해시를 직접 계산해 이 값과 비교하면, 전송 중 파일이 손상되었거나 중간에서 바뀌지 않았는지 확인할 수 있습니다. 한 비트라도 달라지면 해시값은 완전히 달라지기 때문입니다.

단, 체크섬이 파일과 같은 서버에 있다면 공격자가 둘 다 바꿀 수 있다는 한계가 있습니다. 그래서 중요한 소프트웨어는 체크섬 파일 자체에 GPG 서명을 붙이거나, HTTPS로 별도 경로에 게시합니다.

비밀번호 저장에 SHA-256을 그대로 쓰면 안 되는 이유

해시가 일방향이라면 비밀번호를 SHA-256으로 저장하면 안전할 것 같지만, 실제로는 위험합니다. SHA-256은 '빠르게' 계산되도록 설계되어 GPU 한 대로 초당 수십억 번을 계산할 수 있습니다. 공격자가 해시값 목록을 훔치면 흔한 비밀번호를 대량으로 대입해 금방 원래 값을 찾아냅니다.

비밀번호 저장에는 일부러 느리게 설계된 bcrypt, scrypt, Argon2 같은 전용 함수를 써야 합니다. 이 함수들은 사용자마다 다른 무작위 값(솔트)을 섞어, 같은 비밀번호라도 저장된 값이 다르게 만들고, 미리 계산해 둔 해시 사전(레인보우 테이블)도 무력화합니다.

해시, HMAC, 암호화 언제 무엇을 쓸까

AIBIZAP의 해시 생성기로 같은 문장을 여러 알고리즘에 넣어 보고, 한 글자를 바꿨을 때 결과가 얼마나 달라지는지 직접 확인해 보세요. 데이터를 숨겼다가 되돌려야 한다면 AES 암호화 테스트기를 함께 활용할 수 있습니다.

  • 파일이나 데이터가 바뀌지 않았는지 확인: SHA-256 해시
  • 메시지를 보낸 사람이 비밀 키를 가진 정당한 상대인지 확인: HMAC-SHA256 (웹훅 서명, API 요청 서명)
  • 비밀번호 저장: bcrypt, scrypt, Argon2
  • 데이터를 숨겼다가 나중에 다시 읽어야 함: AES-GCM 같은 암호화

이 도구로 직접 해 보세요

다른 가이드

전체 가이드