본문 바로가기

Study/비전공자도 알기 쉬운 이야기들

해시(Hash) 함수 이야기

해시(Hash) 함수 이야기






"md5 해시값을 복호화하는 사이트에서 5초도 안 걸려 계정정보가 복호화가 되는 것을 확인했다."


"사태 초기엔 이용자 650만 명의 계정과 SHA-1 알고리즘 기반 비밀번호 해시값이 유출됐다고 알려졌지만

실제 계정정보 유출 피해 규모는 1억1천700만 명 이상이라는 사실이 지난 5월 추가로 확인됐다."


“당사는 비밀번호를 평문으로 저장하지 않는다방향 해시를 사용한다고 설명했다. 

일방향 해시를 사용할 경우 무작위 대입 공격만이 유일한 복호화 방법으로

이는 시간도 많이 들고 따라서 비용이 크게 올라간다고 강조하며 고객들을 안심시켰다."




인터넷에서 보안 관련 뉴스를 보면 패스워드 유출 사건 기사에 '해시값', 'MD5', 'SHA-1', 'SHA-256' 등 해시 함수와 관련된 단어를 종종 볼 수 있습니다.


한창 뜨거웠다가 요즘은 잠잠해진거 같은 비트코인에서도 해시 함수를 사용하는데 관심이 있다면 이참에 개념을 잡는 데 도움이 되었으면 좋겠습니다.


그럼 해시 함수가 무엇인가에 관해 이야기해보겠습니다.



1. 해시 함수란?


명절 때 뉴스에서 한 번쯤 보았을 법한 떡방앗간에서 가래떡을 뽑는 기계를 생각해봅시다.


기계의 윗부분에 커다란 떡 반죽 덩어리를 올려놓으면 밑으로 가래떡이 길게 늘어져 나오며


일정한 길이가 되면 잘라서 상자에 담는 장면을 본 적이 있을 겁니다.


해시 함수란 이 가래떡을 뽑는 기계와 같은 역할을 하고 있습니다.


다만, 떡을 뽑는 게 아니라 해시 함수에 데이터를 넣으면 일정한 길이의 문자열들이 나오게 됩니다.


또한 기계의 종류가 여러 모델이 있듯이 해시 함수에도 여러 종류가 있습니다.


대표적으로 MD5, SHA-1, SHA-256 등이 있습니다.


각 해시 함수가 어떻게 동작하는지는 여기서는 설명을 생략하고 이런 종류가 있다는 것만 알면 되겠습니다.



2. 해시 함수는 어디에 사용할까?


주로 파일을 내려받았을 때 정상적으로 파일이 다운로드 되었는지 확인하는 용도로 사용하거나 


데이터베이스에 패스워드를 저장할 때 사용 할 수 있습니다.


그밖에도 필요한 곳 어디든 사용할 수 있습니다.


먼저 내려받은 파일을 확인하는 경우를 살펴보겠습니다.


파일을 제공하는 서버는 파일과 그 파일의 해시값을 같이 제공합니다.


사용자는 파일을 내려받은 후에 파일을 해시 함수에 집어넣어서 나온 해시값과 비교해봅니다.


해시값이 같다면 정상적으로 파일을 내려받은 것이고 다르다면 중간에 파일이 깨졌거나 잘못된 파일을 내려받은 것이 됩니다.


위에서 얘기했지만, 파일도 데이터이므로 충분히 해시 함수에 넣을 수 있습니다.


다음으로 패스워드를 저장할 때를 살펴보겠습니다.


패스워드를 그대로 데이터베이스에 저장했다가 데이터베이스가 유출될 경우


아이디 / 패스워드 쌍이 그대로 해커의 손에 넘어가 다른 서비스에서 로그인 시도를 해보는 등 2차 피해를 유발할 수 있습니다.


따라서, 데이터베이스가 유출되더라도 패스워드를 알지 못하도록 하려고 패스워드를 해시 함수에 넣어서 나온 해시값을 저장합니다.



3. 해시 함수는 암호화의 방법일까?


블로그나 뉴스 기사를 보면 해시 함수를 암호화와 동일하게 취급하는 글이 종종 보입니다.


엄밀히 말하면 해시 함수와 암호화는 같은 개념이 아닙니다.


해시 함수는 단방향(일방향)으로서 해시 함수를 통해 나온 문자열 값에서 원래의 데이터로 복원할 수 없습니다.


암호화는 비밀키가 있다면 복호화를 통해 암호화된 값에서 원래의 데이터로 복원할 수 있습니다.


일반적으로 해시 함수를 통해 나온 값을 패스워드로 사용함으로써 눈으로 봐서는 값을 알 수 없기 때문에 암호화라고 얘기하지만 사실은 난독화에 가깝습니다.



4. 해시 함수는 복호화가 가능한가?


위에서 얘기했듯이 해시 함수는 단방향으로서 원래의 데이터로 복원할 수 없다고 했습니다.


하지만 인터넷에서 조금만 찾아보면 MD5, SHA-1을 복호화해준다고 하는 사이트가 많습니다.


이런 곳에서는 어떻게 원본 데이터를 복원해준다고 하는 것일까요?


원칙적으로는 원래의 데이터로 복원할 수 없기 때문에 이런 곳에서는 해시 함수를 통과하게 하는 기능도 같이 제공합니다.


그래서 사용자가 해시 함수를 통과시키려고 시도하는 데이터와 출력으로 나온 해시값을 같이 데이터베이스에 저장합니다.


그럼 반대로 복호화를 시도하려고 하는 사람에게는 데이터베이스의 해시값을 조회해 같은 값이 있다면 원래의 데이터를 보여주는 방식입니다.


해커는 유출된 데이터베이스에서 얻은 해시값을 이런 온라인 복호화 사이트에서 조회해볼 수 있기 때문에


비밀번호로 주로 사용하는 문자열은 해시 함수 온라인 사이트를 이용하지 않는 것이 좋습니다.



시간이 지나면서 장비 성능의 발달로 취약점이 생기게 된 경우가 있습니다.


예를 들어 해시 함수의 결과물인 해시값으로 a,b,c 세 가지의 문자로 길이가 3인 문자열이 나온다고 가정해봅시다. (임의의 해시 함수 내부의 과정을 통해)


그럼 aaa, aab, aac, aba, abb, abc, aca, acb, acc, ... , caa, cab, ... , ccc 이렇게 총 27개의 경우의 수가 있습니다.


하지만 세상에는 데이터의 경우의 수가 무궁무진한데 해시값의 결과로 27개의 경우의 수밖에 없으니


아무래도 원본 데이터는 다르지만 해시값이 같은 경우가 발생합니다.


이런 현상을 충돌(Collision)이라고 합니다.


해시값으로는 원본을 복원할 수 없으니 원본을 바꾸어서 같은 해시값을 갖는 데이터를 찾는 방법입니다.


처음에 예를 들었던 비밀번호 저장에 취약한 해시 함수를 사용하는 것을 다시 생각해봅시다.


이 경우에는 기존에 저장되었던 비밀번호가 아닌 다른 비밀번호를 입력했지만 해시값이 같아 인증을 통과하게 됩니다.


따라서 좀 더 충돌이 생기지 않는 긴 해시값이 나오는 해시 함수를 사용하도록 권장되는 이유이기도 합니다.


'Study > 비전공자도 알기 쉬운 이야기들' 카테고리의 다른 글

AI 챗봇 이야기  (1) 2018.10.01
VR/AR 이야기  (1) 2018.09.11
사물인터넷(IoT) 이야기  (0) 2018.08.30
비트(Bit), 바이트(Byte) 이야기  (2) 2018.04.04