유틸리티 소개

JSON 데이터 해싱할 때 주의점 키 순서가 바뀌면 해시도 바뀐다

API 요청의 무결성을 검증하려고 JSON 본문을 해싱했는데, 서버에서 검증이 실패하는 경우가 있습니다. JSON 키 순서 문제일 확률이 높습니다.

JSON의 특성

JSON 명세상 객체의 키 순서는 의미가 없습니다. {"a":1, "b":2}와 {"b":2, "a":1}은 같은 데이터입니다. 하지만 문자열로 변환하면 다른 문자열이 되고, 당연히 해시값도 달라지죠.

해결 방법

정규화(Canonicalization)가 필요합니다. 1) 키를 알파벳 순으로 정렬 2) 불필요한 공백 제거 3) 유니코드 이스케이프 통일. JSON Canonicalization Scheme(JCS) 같은 표준을 따르면 좋습니다.

실무 팁

해시 생성기를 사용할 때 JSON을 그대로 넣지 말고, 정렬된 형태로 변환한 후 해싱하세요. JavaScript에서는 JSON.stringify(obj, Object.keys(obj).sort()) 패턴을 쓸 수 있습니다.

해시와 보안의 관계

해시는 보안에서 중요한 역할을 하지만, 만능이 아닙니다. 해시 생성기로 만든 해시값은 원본 데이터를 숨기는 데는 좋지만, 짧거나 예측 가능한 입력은 무차별 대입으로 찾아낼 수 있습니다. 예를 들어 4자리 PIN을 해시해도 10,000가지 경우의 수만 시도하면 원본을 찾을 수 있죠. 그래서 비밀번호 해싱에는 솔트(salt)를 추가하고, bcrypt처럼 의도적으로 느린 알고리즘을 씁니다.

레인보우 테이블 공격

미리 계산해둔 해시-원본 쌍을 이용한 공격입니다. 솔트를 사용하면 각 사용자마다 다른 해시가 생성되어 이 공격을 무력화할 수 있습니다. 요즘 프레임워크들은 솔트를 자동으로 처리해주지만, 직접 구현할 때는 반드시 솔트를 포함시켜야 합니다.

결론적으로, 해시 함수는 현대 컴퓨팅의 핵심 기술입니다. 보안, 데이터 관리, 성능 최적화 등 다양한 분야에서 활용되며, 올바르게 사용하면 시스템의 신뢰성을 크게 높일 수 있습니다.