Computer Security - Hasing Function
서론Permalink
블록체인 복습을 하다가 오랜만에 해시함수 개념을 다시 접해서 간단하게 정리해보려고 한다.
해시함수란 공격자가 비밀키를 쉽게 알지 못하도록 만든 개념이다.
시작해보자Permalink
포켓몬스터 지우로 예를 들어보자.
지우가 포켓몬 센터 PC에 접속할 비밀번호를 만들었다.
피카츄를 노리고 있던 로켓단이 지우의 PC 비밀번호를 해킹하기 위해
포켓몬센터의 DB를 털어 버렸고,
DB에는 물론 사용자의 비밀번호가 암호화돼서 저장되어 있다.
하지만 비밀번호의 입력 값을 대입하면서 포켓몬센터 DB에 저장되는 비밀번호 값을 보면서,
로켓단은 지우의 비밀번호를 유추해버렸다.
단순히 3만 더해서 저장하고 있었던 것이다.
지우의 저장된 비밀번호 값을 확인해서 -3을 한 후 피카츄를 납치하려는 순간,
포켓몬센터 서버가 다운되버리는 바람에 실패하게 되었다.
그리고 다행히 서버를 다운시킨 이유가 보안 강화를 위해서였다.
포켓몬 센터 PC 이용자들은 비밀번호를 바꿀 것이 강요되었고,
그 사이에 모두 비밀번호를 변경하였다.
이를 모르고 로켓단은 서버가 다시 정상화되길 기다리고 있었다.
이전 날 알아낸 비밀번호로 지우의 PC에 접속을 하니, 접속이되질 않는다. 비번을 바꿨으니까...
그래서 다시 포켓몬 센터 DB에 몰래 다시 접속해서 해킹을 시도하려고 했다.
다시 접속을 해보니 웬걸 저장되어있는 저장된 비밀번호가 매우 복잡해졌다!!
지우의 비밀번호도 찾아보니 이전과 달리 도무지 규칙성을 찾을 수 없었다.
여기서 포기할 로켓단이 아니다.
모든 Input을 넣어서 DB에 저장되어있는 16자리 비밀번호의 모든 경우의 수를 만들어버리겠다고,
다짐을 했다. 슈퍼 컴퓨터를 써서 1달 만에 16자리 수의 모든 경우의 수를 찾아냈다.
지우의 비밀번호는 DB에 12$nasj6b^06n2@*
로 저장되어 있었고 전수로 대응한 결과,
pikachu
를 쓰면 저 비밀번호가 나오는 것을 알게 되었다.
여기서 쓰인 16자리 문자의 조합이 바로 해시코드이다.
해시코드의 특징으로는
- Input이 비슷해도, 완전히 다른 배열로 바뀌어 버림
- 역행렬로 비밀키를 유추하는 것이 불가능함
- Input에 대응하는 유일한 해시 값을 갖음
이때 로켓단은 슈퍼 컴퓨터를 돌려서 16자리 조합의 모든 해시를 만들어 버렸는데,
이를 Rainbow Table이라고한다.
여기에는 대량의 Input에 대해 대응되는 해시 값들이 들어있다.
드디어 피카츄를 훔칠 수 있다는 부푼 기대감에 PC에 접속을 하게 되었고,
지우의 PC에 접속을 하려는 순간 서버가 다시 다운됐어.
역시 보안 업데이트를 위해 서버를 다운시켰고,
이번에도 포켓몬센터 PC 이용자들에게 비밀번호를 바꿀 것을 강요했다.
지우는 귀찮지만 비밀번호를 이번에도 바꾸게 되었다.
역시 아무것도 모르는 로켓단은 저번과 같은 일이 일어나리라곤 상상도 못하고,
허겁지겁 지우의 PC에 접속을 하려고 pikachu
를 입력하지만,
아무 일도 일어나지 않았디. 이번에도 DB를 보니까 저장되어 있는 비밀번호가 바뀌어버렸다.
저장되어 있는 비밀번호도 64자리로 늘어나버렸다.
64자리의 모든 경우의 수를 얻기 위한 시간을 계산해보니
초당 10억번을 계산한다 치면 하루에 86조 4000억개의 가지 수를 구할 수 있고,
1년엔 3경1536개를 구할 수 있다.
모든 경우의 수인 2^256개를 3경 1536개로 나눠보면,
3,671,743,063,080,802,746,815,416,825,491,118,336,290,905,145,409,708,398,004,109년이 걸린다!!
심지어 이번에는 사용자는 다르지만 비밀번호가 같은 사람도 DB에 저장되어 있는 비밀번호 값이 다르다.
로켓단은 오늘도 계획이 수포로 돌아간다.
오늘도 지우와 피카츄의 승리로 이 이야기는 끝이났다.
이번엔 64자리의 해시코드가 사용되었다. 이는 해시코드를 생성하는
SHA-256
기법을 사용한 것이다. 위와 같이 저거를 전수시도를 해봐서 푸는 것은 불가능하다.추가적으로 다른 사용자지만 같은 비밀번호를 가진 사람의 비밀번호가 다르다.
이는 사용자가 ID를 생성할 때 salt를 추가하여 이를 비밀키 앞에 붙여 해싱하기 때문에,
완전히 다른 문자 배열이 되버린다.salt가 만약
$@ant
라면 아래와 같은 형태로 만들어진다.
마무리Permalink
이 글에서 말하는 모든 비밀키는 비밀번호라고 생각하면 편하다. 혹시 헷갈리시는 분이 있을까 해서...
다음에는 블록체인의 이해를 정리해서 올려보려고 한다.
주위 사람 중에 블록체인 개념에 대해 궁금해 하는 사람이 많다.
내가 빠삭하게 알아서 알려줘야겠다.🍉🍉
댓글남기기