해싱(Hashing)이란 무엇인가?
해싱은 주어진 키(key)를 고유한 코드로 변환하는 과정입니다. 해시 함수(hash function)는 원래 데이터를 새롭게 생성된 해시 코드로 대체하는 역할을 합니다. 즉, 해싱이란 문자열이나 입력 키를 받아 알고리즘에 의해 결정된 해시 값으로 정의하는 작업으로, 그 결과물은 원본보다 훨씬 짧은 문자열 형태로 만들어집니다.
단방향 암호화 함수로서의 해싱
해싱은 일반적으로 단방향(one-way) 암호화 함수입니다. 해시는 되돌릴 수 없기 때문에, 해싱 결과물을 알더라도 원래 파일의 내용을 복원할 수는 없습니다. 대신 파일의 내용을 전혀 몰라도 두 파일이 서로 동일한지 여부만은 확인할 수 있다는 점이 큰 장점입니다.
정보 보안과 인증에서의 활용
해싱은 정보 보안과 인터넷 인증 분야에서 매우 널리 사용됩니다. 대표적인 예로 데이터베이스에 비밀번호를 안전하게 저장하는 경우를 들 수 있으며, 파일이나 문서와 같은 다른 정보 자산의 보안 확보에도 활용됩니다.
효율적인 데이터 검색과 저장
해싱 데이터 구조는 배열이 정보를 빠르게 찾고 저장할 수 있도록 지원하는 효율적인 구조입니다. 예를 들어 20,000개의 숫자로 된 목록에서 특정 숫자를 찾아야 한다면, 일반적인 방식으로는 목록의 숫자를 하나하나 입력값과 비교해 가며 일치 여부를 확인해야 할 것입니다.
마찬가지로 10,000개의 영어 단어 목록에서 특정 단어가 포함되어 있는지 확인하려는 경우, 일치하는 항목을 발견할 때까지 10,000개 항목을 모두 비교하는 것은 매우 비효율적입니다. 반면 해싱을 사용하면 짧은 해시 키를 통해 원본 값을 일일이 대조하는 것보다 훨씬 빠르게 원하는 요소를 찾거나 저장할 수 있습니다.
해시 테이블과 모듈로 연산
키 값의 범위를 기준으로 배열을 인덱싱하는 방식을 해싱이라고 하며, 이때 모듈로(modulo) 연산자를 사용해 키 값의 범위를 구할 수 있습니다. 이러한 방식을 적용하면 20×20 크기의 해시 테이블에 각 항목을 (키, 값) 형태로 효율적으로 저장할 수 있습니다.
주요 해싱 알고리즘
오늘날 널리 사용되는 해싱 알고리즘으로는 MD5, SHA-1, SHA-2, NTLM, LANMAN 등이 있습니다. MD5는 메시지 다이제스트(message digest) 계열의 다섯 번째 버전으로, 과거에는 가장 널리 알려진 해싱 알고리즘 중 하나였으며 128비트 크기의 출력을 생성합니다.
해시 충돌(Collision)이란?
해싱에서는 데이터 블록의 각 비트가 고정된 크기의 비트 문자열 값으로 변환되며, 하나의 파일은 여러 개의 데이터 블록으로 구성됩니다. 이때 서로 다른 두 개의 입력이 동일한 해시 값을 생성할 가능성이 있는데, 이러한 현상을 충돌(collision)이라고 부릅니다. 충돌은 해시 함수 설계 시 반드시 고려해야 하는 중요한 요소입니다.