유틸리티 소개

해시 충돌 공격 실제 사례와 방어하는 방법 MD5 SHA-1 취약점

2017년 구글이 SHA-1 충돌을 실제로 만들어내면서 SHA-1의 종말을 선언했습니다. 해시 충돌 공격이 뭐고, 어떻게 방어해야 할까요?

충돌 공격이란

서로 다른 두 입력이 같은 해시값을 갖는 걸 충돌이라고 합니다. 이론적으로는 해시 길이가 유한하니 충돌이 존재할 수밖에 없지만, 좋은 해시 함수는 충돌을 찾기가 계산적으로 불가능해야 합니다.

실제 피해 사례

MD5 충돌을 이용해 악성 인증서를 만든 사례가 있었습니다. 정상 인증서와 같은 MD5 해시를 가진 악성 인증서로 중간자 공격이 가능했죠. 이 때문에 지금은 MD5를 보안 목적으로 사용하면 안 됩니다.

방어 방법

SHA-256 이상의 알고리즘을 사용하세요. 해시 생성기에서 SHA-256을 선택하면 충분히 안전한 해시값을 얻을 수 있습니다. SHA-3도 좋은 대안입니다.

해시와 보안의 관계

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

레인보우 테이블 공격

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