ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [알쓸신블] 제3장 Hash (feat. SHA-256)
    알아두면 쓸모있는 신나는 블록체인 2019. 1. 2. 10:33
    해시 함수는 임의의 길이를 갖는 임의의 데이터에 대해 고정된 길이의 데이터로 매핑하는 함수를 말한다. 이러한 해시 함수를 적용하여 나온 고정된 길이의 값을 해시값이라고 한다.

    마법의 주문 ‘Hashing’

    ‘제2장 비잔티움 장군의 딜레마’를 살펴보면서 비트코인이 어떻게 딜레마의 해결책을 제시 하였는지에 대하여 알 수 있다. 비트코인의 해결책 POW를 살펴보기 전에 우리는 먼저 Hashing에 대하여 알아보자.


    Hasing이란 많은 양의 데이터들을 그보다 작은 크기의 테이블로 대응시켜 저장할 수 있도록 하는 데이터 관리 기법이다.
    출처 : 비트코인 백서


    블록체인에서 n번째 Block에 n-1 번째의 블록의 Hash값을 넣어 블록들을 연결 시킨다고 한다.

    #535293


    #535293 블록의 용량은 약 0.47MB 이다. 상식적으로 이를 포함하는 #535294 블록의 용량은 0.47MB이상이 되어야 한다.

    #535294


    예상과 다르게 #535294 블록의 용량은 약 0.1MB이다. 이는 이전 블록의 모든 데이터를 직접 추가 시킨 것이 아닌, 이전 블록의 해시값만 추가했기 때문이다. 쉬운 예제를 통해 해시함수 SHA256을 확인해보자.

    [‘류기혁'을 SHA-256으로 Hashing한 Hash 값]

    류기혁을 SHA-256으로 Hashing 하니 64자리의 16진수 값이 나왔다.


    [일기를 SHA-256으로 Hashing한 Hash 값]

    일기를 SHA-256으로 Hashing 하니 64자리의 16진수 값이 나왔다.


    결국 어떠한 데이터를 넣어도 64자리의 16진수 즉, 32Byte의 결과 값을 얻을 수 있다. 이것을 Hash값이라고 한다.

    ‘어떤 값이든 Hash함수로 Hashing하면 특정한 길이의 16진수를 얻을 수 있다. 단, Hash값으로 이전 Data를 복호화 할 수 없다.’

    Hash 함수는 ‘압축' 기술인 것인가.

    n번째 블록은 n-1번째 블록의 Hash 값을 가지고 있다.

    ‘블록체인은 연결 되어 있는 것이고, 이전 블록의 Hash 값을 가지고 있기 때문에 Hash 값으로 이전 블록을 다시 만들어내는 것이군. Hash는 압축과 풀기 기술 이다!’라고 오해할 수 있다.

    오른쪽 클릭 ‘여기에 압축 풀기'


    하지만 Hash 값은 ‘어떤 데이터 에서 이 값이 도출 된 것인가?’ 를 찾기 위한 기술이 아닌 검증을 위한 기술이다.

    블록체인에서 이전 블록의 Hash 값을 저장하는 이유는 n-1번째 블록을 다시 Hashing 하여, 그 값과 현재 블록의 ‘이전 블록의 해시 값’이 일치함을 확인하여 Data의 무결성을 검증하기 위함이다.
    기혁이는 ‘원본Data’ & 이를 Hashing한 Hash를 함께 보낸다.


    [기혁 -> 광우]

    (프라이빗 키로 암호화하는 것은 일단 생략하셔도 됩니다!)

    • 원본 Data
    • 원본 Data를 SHA256으로 Hashing

    기혁이는 광우에게 총 2개의 Data를 보낸다.

    [광우]

    (복호화는 일단 생략셔도 됩니다.)

    • 원본 Data를 SHA256으로 Hashing
    • Hashing된 값과 기혁이에게 받은 Hash값 비교

    위 예제에서 ‘광우'는 Hash 값을 원본 Data를 복호화 하는 용도로 사용하지 않고, 원본Data가 기혁이가 보낸 것이 맞는 지 ‘확인’하기 위하여 사용했다.

    그래서.. 결론이 무엇입니까!!?

    • Hash 값으로 ‘원본Data’ 추출은 불가능 하다.
    • 이전 블록보다 현재 블록의 크기가 다른 이유는 이전 블록 자체를 담는 것이 아닌, Hash된 값만 넣기 때문이다.

    [메이플스토리]

    ID : x기혁x표도x
    PW : 우치하류타치

    [게임회사 DB]

    ID : x기혁x표도x
    PW : 494932DB149F14DD529D58BC2FBE07E3324C1F4101D362DC9DD3ADC51787462B

    [유저가 비밀번호 입력]

    • 유저 ID에 매칭 되는 Hash값 가지고옴
    • Client에서 유저 비밀번호 Hashing 함
    • 두 개가 같다면 이.. 이분은 x기혁x표도x 님이시다…
    다음 화는 POW에 대해 다루어 보겠습니다.

    참고문헌


    댓글

Developer RyuK