2023-04-24
1472
해시함수란 무엇인가요?
(해시함수에도 여러 종류가 있지만, 이 글에서는 SHA-256만을 이야기합니다.)
우선 함수란, 입력값을 받으면 정해진 계산을 수행해서 결과값을 반환하는 규칙을 말합니다. 아주 간단한 예시로는, y = x + 1을 생각해볼 수 있겠습니다. x가 1이면 y는 얼마일까요? 2가 됩니다. 그러면 좀 더 난이도를 올려볼까요? y = x * x - 1를 생각해봅시다. x가 2면 y는 얼마일까요? 2 * 2 - 1 = 3입니다. 그런데, y가 3이 되도록 하는 다른 x는 없을까요? -2도 있습니다! y = (-2) * (-2) - 1 = 3이기 때문입니다.
이처럼 입력값이 같다면 출력값은 반드시 같지만, 출력값이 같다고 해서 입력값이 반드시 같은 것은 아닙니다. 물론 함수를 어떻게 작성하냐에 따라, 입력값이 달라지면 출력값도 완전히 달라지게 만들 수 있습니다.
해시함수는 '임의의 데이터'를 입력값으로 받아서 '고정된 길이의 데이터'를 출력값으로 반환하는 함수입니다. 이 페이지에서 텍스트박스에 값을 넣어보면 상응하는 해시값을 확인할 수 있습니다. 우리가 오늘날 널리 사용하는 SHA-256(Secure Hash Algorithm)은 비트코인 뿐만 아니라 전세계 금융, 군사조직에서도 사용하는 대표적인 안전한 해시함수입니다.
'hello world'를 SHA-256으로 해시하면, 해시값은 [b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9]가 됩니다. 그런데 만약 원문을 살짝 수정해서 'hell world'로 고치고 다시 SHA-256을 계산해보면, 해시값은 [2fe4d4a5963f28b77737c091c436096beee0b74fabb9fcdcd2a4d8859d2099a3]가 됩니다. 이처럼 해시함수는 입력값이 조금만 달라져도 출력값이 완전히 바뀌는데, 이것을 '눈사태 효과'라고 합니다.
이 '눈사태 효과' 때문에 해시값이 다르다면 원본 데이터 역시 다르다고 생각할 수 있고, 해시값이 같다면 원본 데이터도 같을 것이라고 가정할 수 있습니다. 물론 서두에서 말했듯이, 이론적으로는 다른 입력값이 들어와도 같은 해시값이 나올 수 있습니다. 이를 '해시 충돌'이라고 합니다. 그러나 SHA-256의 해시 충돌은 아직 발견된 적이 없으며, 수학적으로 계산한 충돌 확률은 사실상 0에 가깝습니다.
이처럼 해시함수는 출력을 보고 입력이 무엇이었는지를 알아내는 것은 사실상 불가능하지만, 거꾸로 입력이 주어졌을 경우 그 입력이 유효한(변조되지 않은) 입력인지 검증하는 것은 매우 쉽습니다. 이런 특성 때문에, 해시함수는 우리가 일반적으로 이용하는 웹사이트들의 비밀번호처럼 굳이 원문을 모르더라도 위변조 여부만 파악해도 충분한 정보들을 저장하는데 사용됩니다. 이용자의 비밀번호를 그대로 저장하는 것은 개인정보 보호를 이유로 대부분의 관할권에서 금지되어 있기 때문에, 정상적인 웹사이트들은 대개 비밀번호를 해시하여 저장합니다. [03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4]를 보고 원래 비밀번호가 '1234'였는지를 알아낼 수는 없지만, '1234'를 해시하면 앞의 해시값이 나오기 때문에, 유저가 올바른 비밀번호를 입력했는지 검증하는 것은 쉽습니다. 이런 방식을 통해, 웹사이트 운영자는 유저의 비밀번호를 모르더라도 그 유저가 올바른 비밀번호를 입력했는지는 알 수 있습니다.
요약하자면 해시함수는 다음과 같은 특성을 지닙니다.
- 입력값이 같다면 출력이 같다.
- 출력값이 같다면 입력 역시 같을 것이라고 간주해도 좋다.(충돌 확률이 0에 가깝다.)
- 원문을 굳이 알아낼 필요가 없고 단지 원문의 유효성만 검증해도 충분한 경우에 유용하다.
0