해시 포이즌닝은 해시테이블 자료구조를 공격해서 성능을 저하시키는 방법입니다. 보안 해시와는 다른 맥락의 공격입니다.
공격 원리
해시테이블에서 많은 키가 같은 해시값(버킷)으로 가면 성능이 O(1)에서 O(n)으로 나빠집니다. 공격자가 의도적으로 충돌하는 키를 대량으로 보내서 서버를 느리게 만듭니다.
HashDoS
2011년 발견된 HashDoS 공격이 대표적입니다. 웹 서버의 파라미터 파싱에서 해시테이블을 사용하는데, 충돌하는 키를 보내서 CPU를 과부하시킵니다.
방어 방법
시드를 추가한 해시 함수(SipHash 등)를 사용하면 공격자가 충돌을 예측할 수 없습니다. 요즘 언어들은 기본적으로 이런 방어가 적용되어 있습니다. 해시 생성기의 암호화 해시와는 다른 이슈이지만, 해시의 다양한 활용을 보여줍니다.
개발 환경에서의 해시 활용
개발자라면 해시 생성기를 다양한 상황에서 활용할 수 있습니다. API 테스트 시 요청 서명을 검증하거나, 캐시 키를 생성하거나, 파일 업로드 전 중복 체크를 할 때 유용합니다. 특히 디버깅할 때 "내가 계산한 해시가 맞는지" 빠르게 확인하는 용도로 좋습니다. 코드에서 계산한 값과 온라인 도구의 결과가 다르면 인코딩이나 입력 처리에 문제가 있다는 뜻이니까요.
해시 결과 비교 방법
두 해시값을 비교할 때는 대소문자를 통일해야 합니다. 일부 도구는 대문자로, 일부는 소문자로 출력합니다. 프로그래밍에서는 대소문자 무시 비교를 하거나, 양쪽 다 소문자로 변환 후 비교하는 게 안전합니다. 또한 해시 비교는 항상 상수 시간 비교 함수를 사용해야 타이밍 공격을 방지할 수 있습니다.