블록체인 핵심기술 - 2. 해시(Hash), 해시함수(Hash Function)

    블록체인에 대해서 P2P는 뭔지 이해하기 쉽다만, 해시에 대해서 이해를 못한 IT 종사자가 의외로 많습니다. 특히 본인들이 해시함수를 쓰고 있어도 쓰고 있다는 사실 자체를 인지하지 않는 사람들이 많은 것이 바로 해시(Hash)입니다.


    P2P로 구현을 하게 되면, 탈중앙화에 해킹이 되는 것이 안전해진다는 사실을 알고 있을 것입니다. 그런데 우리가 블록체인 블록체인하는데 솔직히 개념은 이해가 되는데 알고리즘이 명확히 머리에 그려지지 않을 것입니다. 블록들을 체인으로 엮는다고 하는데 어떻게 엮는다는 것을 말하는 것일까? 


    이것을 이해하기 위해서 가장 기본적인 기술이 바로 "해시함수"입니다. 해시라고 하든 해시함수라고 하든 큰 의미는 변하지 않기 때문에 이 강의는 해시라고 용어를 통일해서 말을 하도록 하겠습니다.




    해시(Hash)의 기본개념


    흔히들, 해시라고 하면 SNS에서 주로 사용하고 있는 해시태그(#)를 떠올릴지 모르겠습니다. 해시태그가 어떤 값을 분류하고, 검색에 활용되기도 하니 비슷해보일 수 있으나 해시태그와 해시는 다른 의미를 가지고 있습니다.


    위와 같이 긴 문장을 해시함수라는 곳에 입력을 시켜보니, 약 20글자정도의 의미를 알 수 없는 문자+숫자로 결과를 출력하였습니다. 뭔가 값을 축약시켜 주는 놈 같습니다.


    이번에는 매우 짧은 단어를 해시함수라는 곳에 입력을 시켜보았는데, 마찬가지로 약 20글자 정도의 의미를 알 수 없는 문자+숫자의 조합이 결과로 출력되었습니다. 입력값보다 출력값이 크네요. 축약은 아니고 변화시켜 주는 놈 같습니다.


    마지막으로, 매우 짧은 단어지만 바로 전단계에서 사용한 "ABC" 대신 "ABD"를 입력해보았습니다. 그런데 "ABC" 데이터와 입력은 한글자 차이가 나지만 결과는 완전히 다른 20글자의 문자+숫자의 조합이 출력되었습니다. 이것이 바로 해시함수의 가장 큰 특징을 나타내는 것입니다. ABC와 ABD의 약간 다른 입력값으로 인해서 단순히 출력값도 비슷해지겠지 생각을 했지만 완전히 예상을 못하는 난수값을 출력하는게 바로 해시입니다.


    해시의 특징


    바로 위 사례를 보면 알겠지만, 해시함수를 몇가지 특징을 나타내겠습니다.


    1. 뭘 넣든 비슷한 길이의 알수 없는 난수가 결과로 출력이 된다
    2. 글자가 한글자만 바뀌어도 완전히 다른 결과가 출력이 된다
    3. 출력값으로 입력값을 예측할 수 없다.


    이 3가지의 특징이 바로 해시함수의 특징입니다. 사실 몇가지 더 있는데 위 그림만 봤을 때 다이렉트로 예측이 되는것은 위 3가지이고, 몇가지 특징들을 더 파보도록 하겠습니다.



    첫번째 결과를 보면, 입력값보다 출력값이 더 작습니다. 그렇다는 것은, 결과가 동일하더라도 입력값을 알수가 없다는 의미인데 즉, 완전 다른 입력값에서 동일한 출력값이 나올 수 있다는 의미도 지니고 있습니다. 이것을 충돌(Collision)이 났다라고 합니다. 좀 더 정확한 워딩은 해시 충돌(Hash Collision)이라고 불립니다.


    역추적이 안된다는 것은 다른 말로 "단방향"으로만 되어 있다는 의미를 내포합니다.


    위와 같은 해시함수가 과연 어디서 쓰이고 있는지 블록체인에서 어떻게 쓰이고 있을까 알아보도록 해보겠습니다.



    해시가 주로 쓰이는 분야



    아무래도 가장 대표적으로 사용되는 것은 바로 비밀번호를 저장할 때, DB(database, 데이터베이스)에서는 해시함수로 암호화하여 저장을 하는 것입니다. 이럴 경우 해커가 비밀번호를 탈취해도 해당 유저의 "진암호"를 알 수 없기 때문에 해당 유저로 접속을 할 수가 없습니다.




    그리고, 버전관리나 문서 복제등을 체크하기 위해서 해시함수를 사용하는 경우가 꽤 많습니다. 대표적인 알고리즘으로 MD5라는 것을 사용하는데 해시함수가 뭔지는 몰라도 MD5가 뭔지 아는 분들이 많은 건 함정이지만;; 해시는 모든 문자열은 일정한 크기의 문자열로 변환하기 때문에 모든 단어를 비교하는 것보다 당연히 속도가 비약적으로 빠릅니다.




    이 분야는 눈에 띄지 않지만, 문자를 숫자나 저장되는 주소로 치환하여 검색에 사용되는 예도 있습니다다. 예를 들어, 비트코인을 2213으로 변경시켜서 치환한다던지 하는 방식이 있는데 사실 이 방식은 굳이 해시함수를 사용할 필요는 없기 때문에 내부적인 DB의 기능으로만 이해하도록 하겠습니다.(이건 몰라도 됩니다)



    해시가 블록체인에서 사용되는 예



    이제 한번 해시가 블록체인에 어떻게 사용되는지 파고 들어보겠습니다. 옆동네 개똥이가 처음에 5000원을 가지고 있었는데 순심이에게 500원을 줬고, 순심이는 300원은 고길동에게 다시 주고 고길동은 개똥이에게 50원을 줬다고 해보죠.


    이게 일반적으로 기록하고 있는 장부일 겁니다. 이 모든 장부들을 모두가 보유하고 있으면 안전하고, 해킹에 문제가 없을 것입니다만 변조된 사실을 어떻게 알 수 있을까요? 만약에 여기서 순심이의 입금을 500원에서 1000원으로 누군가가 악의적으로 올려버렸다고 할 때, 그 값의 이상을 체크하기가 참 쉽지는 않을 겁니다. 모든 것을 체크하기란 일반적인 컴퓨터의 연산으로 매우 힘드니까요.



    그리고 이러한 연산이 몇억건이나 쌓여있다고 한번 해보겠습니다. 이 중에서 누군가가 개똥이가 순심이에게 500원에서 1000원으로 교체를 하여도, 사람들은 모든 것을 비교해야 하기 때문에 알지 못하고 고길동은 아무런 변화가 없기 때문에 더더욱 눈치 채기 힘들지 모릅니다. 이 어려운 얘기도 해시와 블록체인만 있으면 매우 쉽게 모든 것을 체크할 수 있게 됩니다. 아래 그림과 함께 살펴 보겠습니다.



    해시의 특징을 이해하셨다면 알겠듯이 이 모든 기록들을 단순히 몇글자로 변환할 수 있습니다. 그 글자는 의미가 없는 숫자+알파벳으로 이우어져 있습니다. 이걸로 어떻게 알 수 있을까요? "ABC"와 "ABD"라는 입력값으로 모든 결과값이 다 바뀌었다는 사실을 기억하고 있으신가요?


    이것이 힌트입니다. 즉, 원본의 결과를 해싱했을 때 나오는 결과와 변경된, 개똥이가 순심이에게 500원에서 1000원을 준 해싱 결과는 180도 다르게 나올 것입니다. 우리는 이 결과를 보고, 아래의 결과는 뭔가 이상하다라는 것을 파악할 수 있습니다.



    블록체인의 해시를 한번 그림으로 표현해봤습니다. 현재까지 모든 장부의 기록이 하나의 블록에 해시값으로 기록이 되었다고 쳐보겠습니다. 그리고 새로운 기록을 쓸 준비를 하고 있는데 예전의 기록들이 담긴 해시값을 새로운 기록에 넘깁니다. 그림에서 보면 이전기록에 현재기록을 합치는 모습을 볼 수 있습니다.


    그렇게 해서 새로운 해시값을 다음 블록에 넘기고, 또 현재 블록의 해쉬와 예전 기록을 합쳐서 또 다음 블록에 넘기고 하였을 때, 각자의 노드를 유지하는 사람들은 마지막의 해시값만 동일하다고 가정하였을 때, 모든 기록이 동일하다는 것을 알 수 있을 것입니다.


    단순히 하나의 해시값이지만, 동일한 텍스트와 기록이여야만 가능한 것이기 때문이고, 이로 인해서 해킹이 당한것인지 장부를 악의적으로 조작한 것인지 쉽게 알 수 있는 것입니다. 만약 100개의 노드중에 60개의 노드의 해시값이 동일하고, 나머지 40개의 노드의 해시값이 동일하지 않다면, 60개의 노드가 올바른 것으로 판단하여 40개 노드의 해시값을 무시하게 됩니다. 


    이것이 바로 P2P와 해시를 합쳐서 블록체인을 이루게 되고 탈중앙화를 이루게 만드는 중요한 기술이 됩니다. 이해가 잘 되셨나요? 다음에는 마이닝에 대한 개념을 포스팅 하도록 하겠습니다.


    유튜브 해시 강의


    블로그 내용과 동일합니다.

    댓글

    Designed by JB FACTORY