들어가기 전
우리는 웹사이트 가입을 위해 아이디와 비밀번호를 입력하게 된다. 이때 비밀번호는 대부분 서버에 그대로 저장되지 않고, '해시 함수'라는 기술을 통해 변형된 값만 저장된다. 덕분에 공격가 서버를 턴다고 해도 원래 비밀번호 대신 알 수 없는 긴 문자열(해시값)만 보이기 때문에, 우리의 비밀번호가 바로 노출되지 않는다는 이점이 있다.
하지만 "비밀번호를 해시 처리했으니 무조건 안전해!"라고 생각하면 위험하다. 해시 함수 자체는 강력한 보안 기능이지만, 관리가 제대로 이루어지지 않으면 오히려 취약점이 될 수 있다. 해시값이 노출되면 공격자는 이를 악용할 방법이 많다. 이번 글에서는 그 위험성에 대해 알아보자
본문
1. 해시 함수란 무엇인가?
해시 함수는 입력값을 고정된 길이의 난해한 문자열(해시값)로 변환하는 단방향 함수이다. 즉, 비밀번호를 해시화할 수는 있지만 해시값만 보고 원래 비밀번호를 되돌릴 수는 없다. 이 점이 비밀번호를 안전하게 저장할 수 있는 핵심이다.
예를 들어 비밀번호가 password123이라면, SHA-256 해시 함수로 변환하면 아래와 같은 값이 나온다.
EF92B778BAFE771E89245B89ECBC08A44A4E166C06659911881F383D4473E94F
이 값만으로 원래 비밀번호를 역으로 알아내는 것은 불가능하다. 하지만 해시값이 유출된다면 이야기가 달라진다. 공격자는 이를 활용해 다양한 방법으로 비밀번호를 추측하려고 시도할 수 있다.
2. 해시값 노출이 왜 위험한가?
예를 들어, 로그인할 때 서버가 응답값에 해시화된 비밀번호를 포함해서 보내준다면, 이 해시값이 공격자의 손에 들어갈 수 있다. 비록 해시값 자체만으로 비밀번호를 바로 알아내기느누 어렵지만, 공격자들은 이를 레인보우 테이블이나 사전 공격 같은 기법으로 풀어보려 할 것이다.
해시값이 유출되면, 공격자에게 비밀번호를 뚫을 단서를 제공하게 되는 것이다. 따라서 해시화 자테도 중요하지만, 해시값이 외부에 노출되지 않도록 관리하는 것도 중요하다.
3. 레인보우 테이블이란?
해시 함수를 사용하여 변환 가능한 모든 해시 값을 저장시켜 놓은 표이다. 보통 해시 함수를 이용하여 저장된 비밀번호로부터 원래의 비밀번호를 추출해 내는데 사용된다.
레인보우 테이블은 이미 수많은 비밀번호와 그에 해당하는 해시값을 미리 계산해서 만들어둔 일종의 "해시 대조표"이다. 공격자는 노출된 해시값을 이 표와 비교해서, 같은 해시값이 있으면 원래 비밀번호가 무엇인지 알아낼 수 있다.
하지만 "비밀번호를 해시 처리했으니 무조건 안전해!"라고 생각하면 위험하다. 해시 함수 자체는 강력한 보안 기능이지만, 관리가 제대로 이루어지지 않으면 오히려 취약점이 될 수 있다. 해시값이 노출되면 공격자는 이를 악용할 방법이 많다. 이번 글에서는 그 위험성에 대해 알아보자
마무리
비밀번호가 해시로 변환되어 저장된다고 해서 100% 안전한 건 아니다. 해시값이 노출되면 공격자는 여러 방법을 동원해 원래 비밀번호를 알아내려 할 수 있다. 그렇다면 어떻게 해야 더 안전할까?
1) 솔트(salt) 추가: 비밀번호에 무작위 값을 붙여서 해시 처리하면, 같은 비밀번호여도 해시값이 완전히 달라져서 레인보우 테이블 공격이 어렵다.
2) 페퍼(pepper) 적용: 비밀스럽게 숨겨진 추가 값을 더하면, 해시값만 노출돼도 복호화가 더 어려워진다.
3) 응답값 최소화: 로그인 시 응답값에 불필요한 정보(해시된 비밀번호 같은)를 포함하지 않도록 서버 설정을 꼼꼼히 체크해야 한다.
이러한 방법들 말고도 다양한 방법들이 있을 수 있지만 최소한 이정도만 해줘도 보안에 좋다.
'Knowledge' 카테고리의 다른 글
[Knowledge] DOM-Based XSS (0) | 2025.06.30 |
---|---|
[Knowledge] 공인 IP & 사설 IP & NAT의 역할 (0) | 2025.03.19 |
[Knowledge] 360XSS (1) | 2025.03.09 |
[Knowledge] MITM 공격 (0) | 2025.03.01 |
[Knowledge] Content Type & MIME Type (0) | 2024.11.11 |