본문 바로가기

해시 vs 암호화 차이 완벽 정리 - 비밀번호는 왜 복호화할 수 없을까? 개발 필수 상식

비밀번호는 해시로, 카드번호는 암호화로 저장하는 데는 분명한 이유가 있습니다. 단방향 해시와 양방향 암호화의 차이를 비교표와 실무 사례로 정리하고, MD5를 쓰면 안 되는 이유까지 알려드립니다.


해시 vs 암호화 차이 완벽 정리 - 비밀번호는 왜 복호화할 수 없을까? 개발 필수 상식

회원가입 기능을 개발하다 보면 누구나 한 번쯤 고민합니다. 비밀번호를 암호화해서 저장하면 되는 것 아닌가 하고요. 그런데 공식 문서나 보안 가이드를 찾아보면 비밀번호는 암호화가 아니라 반드시 해시로 저장하라고 나옵니다. 두 단어가 비슷하게 들려서 혼용하는 경우가 많지만, 해시 vs 암호화 차이를 정확히 모르면 실제 보안 사고로 이어질 수 있습니다. 두 기술은 구현 방식만 다른 게 아니라 목적 자체가 다르기 때문입니다.

해시와 암호화, 근본적인 차이는 방향성

가장 큰 차이는 되돌릴 수 있는가입니다. 암호화는 키만 있으면 원문을 복원할 수 있는 양방향 기술이고, 해시는 어떤 방법으로도 원문을 되돌릴 수 없는 단방향 기술입니다. 이 한 가지 차이에서 용도가 완전히 갈립니다.

해시는 단방향 요약

해시 함수는 입력 길이와 상관없이 항상 고정된 길이의 결과를 출력합니다. SHA-256은 한 글자를 넣어도, 1GB 파일을 넣어도 항상 256비트, 즉 64자리 16진수 문자열을 반환합니다. 입력이 한 글자만 바뀌어도 결과 전체가 완전히 달라지는 눈사태 효과가 있어서, 데이터가 변조됐는지 확인하는 데 최적입니다. 대신 64자리 결과값만 보고 원문을 계산해내는 것은 불가능합니다.

암호화는 양방향 변환

암호화는 평문을 키로 잠그고, 같은 키 또는 짝이 되는 키로 다시 여는 구조입니다. 카드번호나 주민등록번호처럼 나중에 원문을 다시 읽어야 하는 정보를 보호할 때 사용합니다. 키가 없는 사람에게는 무의미한 데이터지만, 키를 가진 시스템은 언제든 원문을 복원할 수 있습니다.

해시 알고리즘 종류와 선택 기준

해시라고 다 같은 해시가 아닙니다. 어떤 알고리즘은 이미 깨졌고, 어떤 알고리즘은 용도가 따로 정해져 있습니다.

  • MD5: 128비트, 32자리 출력. 2004년에 서로 다른 입력이 같은 해시값을 만드는 충돌이 실제로 발견되어 보안 용도로는 사용하면 안 됩니다.
  • SHA-1: 160비트 출력. 2017년 구글이 실제 충돌 사례(SHAttered)를 공개하면서 퇴출 수순에 들어갔습니다.
  • SHA-256: 현재 가장 널리 쓰이는 표준입니다. 파일 무결성 검증, 전자서명, 블록체인 등에 사용됩니다.
  • bcrypt, Argon2: 비밀번호 전용 해시입니다. 의도적으로 느리게 설계되어 무차별 대입 공격 비용을 크게 높입니다.

여기서 중요한 포인트가 있습니다. 비밀번호 저장에 SHA-256을 그대로 쓰는 것도 권장되지 않습니다. SHA-256은 속도가 매우 빨라서 GPU 장비로 초당 수십억 번의 해시 계산이 가능하고, 그만큼 대입 공격에 취약해집니다. 그래서 비밀번호에는 계산이 일부러 느린 bcrypt나 Argon2를 쓰고, 사용자마다 다른 무작위 값인 솔트(salt)를 붙여 같은 비밀번호라도 다른 해시값이 나오게 만듭니다.

팁: bcrypt는 cost factor 값으로 계산 속도를 조절할 수 있습니다. 보통 10에서 12 사이로 설정하면 해시 한 번에 수백 밀리초가 걸려서, 공격자가 수억 개의 조합을 대입하는 비용이 감당하기 어려운 수준으로 올라갑니다.

암호화의 두 가지 방식, 대칭키와 비대칭키

대칭키 암호화

잠글 때와 열 때 같은 키를 사용하는 방식입니다. 대표 알고리즘은 AES이고, 키 길이에 따라 AES-128, AES-256으로 나뉩니다. 속도가 빠르고 대용량 데이터 처리에 유리하지만, 키를 상대방에게 안전하게 전달하는 것이 숙제입니다.

비대칭키 암호화

공개키와 개인키라는 키 쌍을 사용합니다. 공개키로 잠근 데이터는 짝이 되는 개인키로만 열 수 있습니다. 대표 알고리즘은 RSA이며 실무에서는 2048비트 이상 키를 사용합니다. 키 전달 문제를 해결하지만 대칭키보다 계산이 훨씬 느립니다.

참고: HTTPS는 두 방식을 조합한 하이브리드 구조입니다. 처음 연결할 때 비대칭키 방식으로 세션 키를 안전하게 교환하고, 이후 실제 데이터는 속도가 빠른 대칭키(AES)로 암호화합니다. 각 방식의 장점만 가져온 설계입니다.

한눈에 보는 해시 vs 암호화 비교표

구분해시암호화
방향성단방향, 복원 불가양방향, 복호화 가능
키 필요 여부없음 (솔트는 키가 아님)필수 (대칭키 또는 키 쌍)
출력 길이고정 (SHA-256은 64자리)입력 길이에 비례
대표 알고리즘SHA-256, bcrypt, Argon2AES-256, RSA-2048
주 용도비밀번호 저장, 무결성 검증개인정보 보호, 통신 보안
기준은 하나입니다. 원문을 다시 읽어야 하면 암호화, 일치 여부만 확인하면 되면 해시입니다. 비밀번호는 서버가 원문을 알 필요가 전혀 없기 때문에 해시가 정답입니다. 로그인할 때는 입력값을 다시 해시해서 저장된 해시값과 비교만 하면 됩니다.

실무 활용 사례 4가지

개념을 알았으니 실제로 어디에 쓰이는지 정리해 보겠습니다.

  • 비밀번호 저장: bcrypt 또는 Argon2 해시에 솔트를 더해 저장합니다. 유출되어도 원문 복원이 사실상 불가능합니다.
  • 파일 무결성 검증: 설치 파일을 배포할 때 SHA-256 체크섬을 함께 공개해서, 다운로드한 파일이 변조되지 않았는지 확인하게 합니다.
  • 개인정보 저장: 카드번호처럼 다시 읽어야 하는 데이터는 AES-256 같은 대칭키 암호화로 보호합니다.
  • 통신 구간 보호: HTTPS, VPN 등이 암호화로 전송 데이터를 지킵니다.

개발 중에 해시값을 다룰 일이 생기면 형식 검증부터 하는 습관이 좋습니다. 예를 들어 SHA-256 해시값이 올바른 형식인지 확인하려면 ^[a-f0-9]{64}$ 같은 패턴을 쓰면 되는데, 이런 패턴은 정규식 테스터에 붙여 넣고 실제 해시값으로 바로 테스트해 볼 수 있습니다. 또 세션 ID나 임시 토큰처럼 예측 불가능한 고유 식별자가 필요할 때는 해시를 억지로 응용하기보다 UUID v4를 쓰는 것이 표준적인 방법입니다. UUID 생성기에서 형식을 직접 확인해 보면 36자리 구조가 한눈에 들어옵니다.

지금 바로 확인해야 할 것

운영 중인 프로젝트가 있다면 두 가지만 점검해 보세요. 첫째, 코드에서 MD5나 SHA-1을 보안 용도로 쓰는 곳이 있는지 검색해서 SHA-256 이상으로 교체합니다. 둘째, 사용자 비밀번호가 bcrypt 또는 Argon2에 솔트를 적용해 저장되고 있는지 확인합니다. 만약 평문이나 자체 암호화 방식으로 저장하고 있다면 지금이 바꿀 타이밍입니다. 이 두 가지만 지켜도 데이터 유출 사고가 났을 때 피해 규모가 완전히 달라집니다.

3일 무료체험큰손탐지기, 지금 바로 시작하세요

설치 없이 웹에서 바로 사용 가능 · PC & 모바일 지원

무료체험 시작
카카오톡 상담