해시 함수는 단방향입니다. 원본에서 해시를 구하기는 쉽지만, 해시에서 원본을 역산하는 것은 불가능하도록 설계되어 있습니다.
단방향 함수란
A에서 B를 구하기는 쉽지만 B에서 A를 구하기가 어려운 함수입니다. 해시 함수가 대표적입니다. 해시 생성기에 "hello"를 넣으면 해시가 나오지만, 그 해시만 보고 "hello"를 알아내는 건 불가능합니다.
왜 역산이 불가능한가
해시 과정에서 정보가 손실됩니다. 무한한 입력이 유한한 해시로 변환되므로 여러 입력이 같은 해시를 가질 수 있습니다. 어떤 원본에서 왔는지 특정할 수 없습니다.
무작위 대입(brute force)으로 모든 가능성을 시도할 수는 있지만, 입력이 조금만 길어도 현실적으로 불가능한 시간이 걸립니다.
레인보우 테이블
흔한 비밀번호의 해시를 미리 계산해둔 테이블이 있습니다. 이걸로 역추적을 시도할 수 있어서 비밀번호에는 솔트를 추가합니다. 온라인 해시 도구로 실험하면서 해시의 특성을 이해해보세요.
해시 생성기 활용 팁
이런 상황에서 해시 생성기를 활용하면 효율적입니다. 먼저 원하는 알고리즘(MD5, SHA-256, SHA-512 등)을 선택하고, 입력값을 넣으면 즉시 해시값을 얻을 수 있습니다. 개발자라면 API 호출 시 서명 검증, 파일 무결성 확인, 비밀번호 해시 테스트 등에 활용할 수 있죠. 비개발자도 다운로드 파일이 변조되지 않았는지 확인할 때 유용합니다. 중요한 건 입력이 조금만 달라져도 결과가 완전히 바뀐다는 점입니다. 공백 하나, 대소문자 하나 차이도 전혀 다른 해시값을 만들어냅니다.
실무에서 자주 하는 실수
가장 흔한 실수는 인코딩을 고려하지 않는 것입니다. 같은 한글 텍스트라도 UTF-8과 EUC-KR로 인코딩하면 다른 바이트 시퀀스가 되고, 당연히 해시값도 달라집니다. 텍스트를 해시할 때는 항상 인코딩을 통일해야 합니다. 또 다른 실수는 줄바꿈 문자입니다. Windows와 Linux/Mac의 줄바꿈이 다르기 때문에 같은 텍스트 파일도 운영체제에 따라 해시가 달라질 수 있습니다.