해싱(Hashing)은 입력값에 수학적 알고리즘(해시 함수)을 적용하여 고정된 크기의 문자열을 출력하는 과정입니다. 출력된 문자열은 무작위적으로 보이고 보통 16진수의 형식입니다. 입력값의 크기와 상관없이 해시라고 부르는 출력값은 항상 알고리즘에 정의된 고정 길이로 출력됩니다. 큰 크기의 '뚱뚱한' 문자열이 해싱 이후에는 짧고 '날씬'해지기 때문에 해싱은 '메시지 다이제스트'라고 부르기도 해요. 해싱은 주로 컴퓨터 과학에서 데이터 무결성, 효율적인 데이터 관리를 위해 사용됩니다.
해시 함수는 해싱의 중심에 있어요. 해시 함수의 입력값, 출력값, 종류를 더 자세히 살펴볼게요.
입력값
해시 함수의 입력값은 '메시지'라고 부르기도 합니다. 입력값으로는 다양한 길이와 형태의 데이터가 사용돼요. 단일 문자, 음악 파일, 메시지뿐만 아니라 복잡한 데이터 구조도 입력할 수 있습니다. 해시 함수는 이진수로 데이터를 처리하기 때문에 입력값을 이진수로 변환하고 해싱합니다.
해시 함수
해시 함수는 입력값을 고정된 크기의 블록으로 나눈 다음에 수학적 연산을 적용해서 최종 해시를 출력해요. 해시 함수는 주어진 입력에 대해 항상 동일한 해시를 생성하고, 입력 데이터가 조금이라도 바뀌어도 출력값은 크게 달라집니다.
또, 좋은 해시 함수는 효율적이고 다른 입력이 동일한 해시를 생성하는 것을 거의 불가능하게 합니다. 이런 특성 때문에 해시를 데이터 비교 및 무결성에 안전하게 사용할 수 있어요.
대표적으로 사용되는 해시 함수는 다음과 같습니다.
- 암호화 해시 함수(Cryptographic Hash Functions): 비밀번호 보관, 디지털 서명 등 보안 관련 용도로 사용되는 해시 함수입니다. 대표적으로는 SHA-256, SHA-3, MD5 함수가 있어요.
- 비암호화 해시 함수(Non-cryptographic Hash Functions): 데이터 인덱싱 또는 해시 테이블과 같이 보안보다 효율이 필요할 때 사용되는 해시 합수입니다. 대표적으로는 MurmurHash, CityHash 함수가 있어요.
출력값
해시 함수의 출력값은 '해시' 또는 '다이제스트'라고도 하는데요. 각 입력값에 고유한 출력값이 생성되기 때문에 지문과 비슷하다고 생각할 수 있어요. 출력값의 길이는 해시 함수에 따라 달라집니다. 예를 들어 SHA-256 해시 함수는 항상 265비트의 출력값을 생성해요.
해싱은 암호화와 달리 출력값을 원본 입력값으로 복호화할 수 없어요. 출력값은 항상 고정된 길이의 문자열을 출력하기 때문에 입력 데이터가 손실돼요. 출력값과 해싱 함수를 안다고 해도 대응하는 입력값을 찾는 것은 어려워요.
해시 함수는 다양한 분야에서 중요한 역할을 하고 있어요.
-
데이터 무결성: 해시 함수로 데이터가 조작되지 않았는지 검증할 수 있습니다. 예를 들어, 파일을 다운로드하면 파일과 함께 해시가 제공되는데요. 다운로드 파일을 해싱해서 나오는 출력값과 다운로드할 때 받은 해시와 비교하면 데이터 무결성을 확인할 수 있어요.
-
디지털 서명: 암호화 해시 함수로 메시지나 문서에 디지털 서명을 추가할 수 있어요. 디지털 서명은 메시지 전송자의 신원을 증명하고 내용이 변조되지 않았음을 보증합니다. 전송자는 메시지의 해시를 암호화해서 디지털 서명을 생성해요. 수신자는 디지털 서명을 복호화한 다음에 수신한 메시지의 해시와 비교합니다.
-
비밀번호 저장: 대부분의 서비스는 사용자의 실제 비밀번호를 서버에 저장하지 않고, 비밀번호의 해시를 저장합니다. 서버가 해킹되어도 실제 비밀번호가 노출되지 않기 때문에 비밀번호가 안전하게 보호돼요. 사용자가 비밀번호를 입력하면 비밀번호를 해싱하고, 서버에 있는 해시랑 비교해서 사용자의 신원을 확인해요.
-
해시 테이블: 테이블의 인덱스로 해시를 사용하는 자료구조입니다. 검색이 빠르다는 장점이 있지만 충돌이 일어날 수 있다는 위험이 있어요.