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