해싱

기술노트
Admin (토론 | 기여)님의 2025년 9월 6일 (토) 05:05 판 (Gemini 벌크 업로더로 자동 업로드)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

🧮 해싱 (Hashing)

해싱은 임의의 길이의 데이터를 고정된 길이의 데이터(해시 값, Hash Value)로 매핑하는 과정을 의미합니다. 이 변환 과정에는 '해시 함수(Hash Function)'가 사용됩니다.

해싱의 가장 중요한 특징은 '단방향성(One-way)'입니다. 입력 값으로 해시 값을 계산하기는 쉽지만, 해시 값만으로는 원래의 입력 값을 알아낼 수 없어야 합니다. 이 특징 때문에 해싱은 주로 데이터의 무결성 검증이나 비밀번호 저장과 같이, 복호화가 필요 없는 데이터의 안전한 저장에 사용됩니다.


⚙️ 해시 함수의 특징

좋은 해시 함수는 다음과 같은 특징을 가집니다.

  • 단방향성 : 해시 값에서 원본 데이터를 추론할 수 없어야 합니다.
  • 결정성 : 동일한 입력 값에 대해서는 항상 동일한 해시 값이 출력되어야 합니다.
  • 충돌 저항성 : 서로 다른 입력 값에서 동일한 해시 값이 나올 확률(해시 충돌, Hash Collision)이 매우 낮아야 합니다.
  • 속도 : 해시 값을 빠르게 계산할 수 있어야 합니다.

🔐 비밀번호 저장에의 활용

사용자의 비밀번호를 데이터베이스에 그대로 저장하는 것은 매우 위험합니다. 해싱은 비밀번호를 안전하게 저장하는 표준적인 방법입니다.

1. 사용자가 회원가입 시 비밀번호를 입력합니다. (`password123`) 2. 서버는 이 비밀번호를 해시 함수를 통해 해시 값으로 변환합니다. (`e.g., a1b2c3d4...`) 3. 데이터베이스에는 원본 비밀번호가 아닌, 이 해시 값만 저장합니다. 4. 사용자가 로그인할 때, 입력한 비밀번호를 다시 동일한 해시 함수로 변환하여, DB에 저장된 해시 값과 일치하는지 비교합니다.

  • 솔트 (Salt) & 키 스트레칭 (Key Stretching) : 더 강력한 보안을 위해, 해싱 전 원본 비밀번호에 '솔트'라는 임의의 값을 추가하고, 해시 함수를 수천 번 이상 반복(키 스트레칭)하여, 레인보우 테이블 공격과 같은 해킹 시도를 무력화합니다. `bcrypt`, `scrypt` 와 같은 알고리즘이 이 방식을 사용합니다.

💡 개발자 핵심 Point

  • 해싱은 복호화가 불가능한 '단방향' 암호화, 암호화(Encryption)는 복호화가 가능한 '양방향' 암호화라는 점이 가장 큰 차이입니다.
  • 사용자의 비밀번호는 반드시 솔트와 키 스트레칭이 적용된 안전한 해시 알고리즘(예: bcrypt)을 사용하여 저장해야 합니다.
  • 해싱은 데이터의 무결성 검증에도 사용됩니다. 대용량 파일을 다운로드할 때, 파일 제공자가 명시한 해시 값과 내가 다운로드한 파일의 해시 값을 비교하여 파일이 중간에 변조되지 않았는지 확인할 수 있습니다.