해시 함수는 임의 길이의 데이터를 고정 길이의 값(해시·다이제스트)으로 변환하는 함수입니다. 같은 입력은 항상 같은 해시를 내지만, 입력이 1비트만 달라도 완전히 다른 해시가 나옵니다.
좋은 암호학적 해시의 핵심 성질은 단방향성입니다. 해시값만 보고 원래 입력을 되돌리는 것이 사실상 불가능합니다. 그래서 비밀번호를 평문 대신 해시로 저장하면, 데이터가 유출돼도 원문을 곧바로 알 수 없습니다.
충돌은 서로 다른 두 입력이 같은 해시를 갖는 경우입니다. 이론적으로는 존재하지만, 안전한 해시에서는 이를 의도적으로 만들기가 계산상 불가능해야 합니다. MD5·SHA-1이 폐기된 이유가 바로 충돌을 만들 수 있게 됐기 때문입니다.
비밀번호 저장에는 해시만으로 부족합니다. 같은 비밀번호가 같은 해시를 내므로, 입력마다 무작위 값인 솔트(salt)를 더해 해시하고, bcrypt·Argon2 같은 느린 해시를 써서 대량 추측 공격을 늦춥니다.