해시만 쓰거나 암호화만 쓰는 게 아니라, 둘을 조합해서 쓰는 경우가 많습니다. 대표적인 패턴들을 알아볼까요?
디지털 서명
긴 문서를 직접 서명하면 느리니까, 먼저 문서를 해시한 후 해시값에 개인키로 서명합니다. 검증할 때는 공개키로 서명을 복호화해서 해시값과 비교하죠. 해시 생성기로 만든 해시가 서명의 기초가 됩니다.
키 유도 함수(KDF)
사용자 비밀번호에서 암호화 키를 만들 때 PBKDF2, scrypt 같은 함수를 씁니다. 내부적으로 해시를 여러 번 반복해서 충분히 긴 키를 생성하죠.
암호화 후 해시(Encrypt-then-MAC)
데이터를 암호화한 후 암호문의 해시(MAC)를 붙입니다. 복호화 전에 MAC을 검증해서 변조 여부를 먼저 확인하는 안전한 패턴입니다.
해시와 보안의 관계
해시는 보안에서 중요한 역할을 하지만, 만능이 아닙니다. 해시 생성기로 만든 해시값은 원본 데이터를 숨기는 데는 좋지만, 짧거나 예측 가능한 입력은 무차별 대입으로 찾아낼 수 있습니다. 예를 들어 4자리 PIN을 해시해도 10,000가지 경우의 수만 시도하면 원본을 찾을 수 있죠. 그래서 비밀번호 해싱에는 솔트(salt)를 추가하고, bcrypt처럼 의도적으로 느린 알고리즘을 씁니다.
레인보우 테이블 공격
미리 계산해둔 해시-원본 쌍을 이용한 공격입니다. 솔트를 사용하면 각 사용자마다 다른 해시가 생성되어 이 공격을 무력화할 수 있습니다. 요즘 프레임워크들은 솔트를 자동으로 처리해주지만, 직접 구현할 때는 반드시 솔트를 포함시켜야 합니다.
결론적으로, 해시 함수는 현대 컴퓨팅의 핵심 기술입니다. 보안, 데이터 관리, 성능 최적화 등 다양한 분야에서 활용되며, 올바르게 사용하면 시스템의 신뢰성을 크게 높일 수 있습니다.