Computer >> 컴퓨터 >  >> 네트워킹 >> 네트워크 보안

네트워크 보안에서 해싱(Hashing)이란 무엇일까? 핵심 개념 완벽 정리

해싱(Hashing)이란 무엇인가?

해싱은 하나의 값을 수학적 알고리즘을 통해 전혀 다른 새로운 값으로 변환하는 과정입니다. 이렇게 생성된 결과물을 '해시값(hash value)' 또는 '해시 다이제스트(digest)'라고 부릅니다.

간단한 예를 들어보겠습니다. 20,000개의 숫자 목록에서 특정 숫자를 찾아야 한다면, 일반적인 방식으로는 처음부터 끝까지 하나씩 일일이 확인해야 합니다. 하지만 해싱 데이터 구조를 활용하면 키(key)와 값(value)의 매핑을 통해 원하는 데이터를 단 한 번의 탐색으로 빠르게 찾고 저장할 수 있습니다.

해시 함수란 무엇인가?

해시 함수(hash function)는 시스템 보안의 핵심 요소로, 임의의 입력값을 규칙성 없는 고정 길이의 값으로 변환하는 수학적 함수입니다. 해시값은 단순한 숫자 형태이며, 주로 16진수로 인코딩되거나 이진수(binary) 형태로 관리됩니다.

해시 함수의 가장 큰 특징은 어떤 길이의 입력이 들어와도 항상 고정된 길이의 결과를 반환한다는 점입니다. 예를 들어 MD5는 어떤 문자열이든 128비트로, SHA-256은 256비트로 변환합니다.

해싱과 암호화의 차이점

해싱과 암호화는 모두 원본 데이터를 다른 형태로 변환한다는 공통점이 있지만, 그 목적과 작동 방식은 완전히 다릅니다.

  • 암호화(Encryption): 양방향 방식입니다. 올바른 키만 있다면 암호문을 다시 원래의 평문으로 복호화할 수 있습니다.
  • 해싱(Hashing): 단방향 방식입니다. 평문을 스크램블하여 다이제스트를 만들지만, 원래 값으로 되돌리는 것은 불가능합니다.

잘 설계된 해시 알고리즘은 원본 비밀번호의 다이제스트를 확인해도 인증 절차를 역으로 추적할 수 없도록 만듭니다.

해싱은 어떻게 보안에 활용되는가?

해싱은 수학 공식을 사용해 하나의 데이터 집합을 고정된 길이의 또 다른 데이터로 변환합니다. 가장 대표적인 활용 사례가 바로 비밀번호 관리입니다.

사용자가 회원가입 시 비밀번호를 입력하면, 시스템은 이를 해싱하여 다이제스트 형태로 저장합니다. 이후 로그인할 때마다 입력된 비밀번호를 다시 해싱한 뒤, 저장된 다이제스트와 비교하여 일치 여부를 확인합니다. 덕분에 데이터베이스에 평문 비밀번호를 저장하지 않아도 되므로 보안이 크게 강화됩니다.

또한 해싱은 파일과 문서의 진위 여부 및 무결성 검증에도 널리 사용됩니다. 원본 데이터가 아주 조금이라도 변경되면 해시값이 완전히 달라지기 때문에, 데이터가 위변조되지 않았음을 증명하는 데 효과적입니다.

대표적인 해싱 알고리즘

현재 널리 사용되는 해싱 알고리즘으로는 MD5, SHA-1, SHA-2, NTLM, LANMAN 등이 있습니다.

  • MD5(Message Digest 5): 과거 가장 인기 있던 알고리즘으로, 128비트 출력을 생성합니다. 메시지 다이제스트 계열의 다섯 번째 버전입니다.
  • SHA-256: 해시 문자열의 각 바이트가 8비트씩 구성되어 총 256비트의 정보를 담는 알고리즘입니다. 모든 입력에 대해 동일한 길이의 출력을 제공하며, 현재 보안 분야에서 가장 신뢰받는 표준 중 하나입니다.

다만 MD5나 SHA-1처럼 오래된 알고리즘은 충돌 취약점이 발견되었기 때문에, 보안 목적으로는 SHA-256 이상의 강력한 알고리즘을 사용하는 것이 권장됩니다.

해시 충돌(Collision)이란 무엇인가?

해싱에서는 서로 다른 두 입력이 동일한 해시값을 생성하는 경우가 발생할 수 있는데, 이를 '충돌(collision)'이라고 합니다. 예를 들어 MD5는 어떤 문자열이든 128비트로 매핑하기 때문에, 그보다 긴 문자열들을 모두 처리하면 필연적으로 같은 해시값을 가지는 문자열들이 존재하게 됩니다.

FIPS 180-4 표준에서 정의하는 '안전한 해시 알고리즘(Secure Hash Algorithm)'이란, 특정 다이제스트에 해당하는 메시지를 찾거나 동일한 다이제스트를 갖는 두 메시지를 찾는 것이 계산상 불가능한 알고리즘을 의미합니다.

해싱의 핵심 원리

해싱의 핵심 아이디어는 다음과 같이 정리할 수 있습니다.

  • 키(key)와 값(value)을 배열 전체에 고르게 분산시켜 저장합니다.
  • 각 요소는 고유한 키를 가지며, 이 키를 통해 단 한 번의 탐색으로 해당 요소에 접근할 수 있습니다.
  • 해시 함수는 키를 기반으로 배열 인덱스를 생성하여, 데이터를 찾거나 삽입할 위치를 결정합니다.
  • 모듈로(modulo) 연산자를 활용하면 키 값의 범위를 조절할 수 있습니다. 예를 들어 20×20 크기의 해시 테이블에 (키, 값) 형태의 항목들을 저장하는 방식입니다.

해시 맵(map)의 성능은 결국 해시 알고리즘의 품질에 좌우됩니다. 해시 함수 H(x)는 입력값 x를 배열 인덱스로 매핑하는 역할을 수행합니다.

해시는 복호화가 가능한가?

결론부터 말하면, 해싱은 근본적으로 되돌릴 수 없는(non-reversible) 과정입니다. 따라서 해시를 위한 복호화 알고리즘은 존재하지 않으며, 이것이 바로 해싱이 비밀번호 저장에 적합한 이유입니다.

해시 함수는 의도적으로 복호화가 불가능하도록 설계되었으며, 그 알고리즘 자체는 누구에게나 공개되어 있습니다. 해시를 '크랙'하려면 무차별 대입(brute force) 공격 등으로 원본 데이터를 추측하는 방법 외에는 뚜렷한 방법이 없습니다.

해커들은 해싱을 어떻게 활용하는가?

비밀번호 해싱은 가장 일반적인 단방향 보안 기법입니다. 해시 함수는 수학적 알고리즘을 통해 사용자의 비밀번호로부터 고정된 길이의 데이터를 생성하며, 생성된 다이제스트는 되돌릴 수 없고 유일하다는 강점이 있습니다.

반면 공격자 입장에서는 유출된 해시값을 대상으로 무차별 대입 공격이나 사전(dictionary) 공격을 시도할 수 있습니다. 따라서 솔팅(salting) 기법과 함께 강력한 해시 알고리즘을 적용하는 것이 안전한 시스템 구축의 기본입니다.