Info

해시(Hash)란 무엇인가 — 비밀번호가 저장되는 방식

toolzip 2026. 10. 7. 19:00

여러분의 비밀번호는 어떻게 저장될까요? 어딘가에 "password123"이라고 그대로 저장되어 있을까요? 그렇지 않습니다. 해시라는 기술 덕분에 여러분의 비밀번호는 아무도 읽을 수 없는 형태로 저장됩니다.


해시 함수란

해시 함수는 어떤 데이터를 넣어도 정해진 길이의 결과를 내뱉는 함수입니다. 중요한 특성이 있습니다. 같은 입력은 항상 같은 결과가 나오지만, 결과를 보고 원래 입력을 알아낼 수는 없습니다. 일방통행입니다.

예를 들어 SHA-256이라는 해시 함수에 "hello"를 넣으면 항상 이 값이 나옵니다.

2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824

64자리 16진수입니다. 이 값을 보고 원래 입력이 "hello"였다는 것을 알아낼 방법은 없습니다.


비밀번호가 저장되는 방식

사이트에 처음 가입할 때 비밀번호를 입력하면 서버는 이것을 그대로 저장하지 않습니다.

  1. 입력한 비밀번호를 해시 함수에 넣습니다.
  2. 나온 결과값(해시값)을 데이터베이스에 저장합니다.
  3. 원본 비밀번호는 어디에도 저장되지 않습니다.

다음에 로그인할 때는 이렇게 동작합니다.

  1. 입력한 비밀번호를 해시 함수에 넣습니다.
  2. 나온 결과값을 데이터베이스에 저장된 값과 비교합니다.
  3. 두 값이 같으면 로그인 성공입니다.

서버는 비밀번호를 모르고도 비밀번호가 맞는지 확인할 수 있습니다.


해킹을 당해도 비밀번호가 안전한 이유

사이트가 해킹당해서 데이터베이스가 유출됐다고 가정합니다. 해커가 가져간 것은 해시값뿐입니다. "2cf24dba..."라는 값을 보고 원래 비밀번호가 "hello"였다는 것을 알 수 없습니다.

이론적으로는 그렇습니다. 하지만 현실에서는 조금 다릅니다.


레인보우 테이블의 위협

"password", "123456", "qwerty" 같은 흔한 비밀번호의 해시값은 미리 계산해둘 수 있습니다. 이런 미리 계산된 해시값 목록을 레인보우 테이블이라고 합니다.

해커가 해시값 "2cf24dba..."를 가지고 레인보우 테이블에서 찾으면 "hello"에 해당하는 값이라는 것을 알 수 있습니다.

단순한 해시만으로는 부족합니다.


솔팅 — 레인보우 테이블을 무력화하는 방법

솔팅(Salting)은 비밀번호에 무작위 값(솔트)을 추가해서 해시하는 방법입니다.

같은 "hello"라도 솔트가 "abc123"이라면 "helloabc123"을 해시합니다. 사용자마다 다른 솔트를 사용하므로 같은 비밀번호여도 다른 해시값이 나옵니다. 레인보우 테이블이 무력화됩니다.


파일 무결성 확인에도 사용됩니다

해시는 비밀번호 외에도 파일이 변조됐는지 확인하는 데 사용됩니다. 소프트웨어를 배포할 때 파일의 해시값을 함께 공개합니다. 다운로드한 파일의 해시값을 계산해서 공개된 값과 비교하면 파일이 중간에 변조됐는지 알 수 있습니다.


정리

해시 함수는 데이터를 일방통행으로 변환합니다. 결과를 보고 원본을 알 수 없습니다. 이 특성을 이용해 비밀번호를 안전하게 저장하고, 파일의 무결성을 확인합니다. 여러분이 비밀번호를 잊어버렸을 때 사이트가 비밀번호를 알려주지 못하고 재설정만 가능한 이유가 바로 이것입니다.