💡해시 함수
본래 해시라는 것의 어원은 고기와 감자를 잘게 다져서 섞어 만든 요리이다. 우리가 잘 아는 해시 브라운도 감자를 잘게 다져서 튀김 음식이다. 어원이 이렇듯, 해시 함수도 원본 데이터를 잘게 조각내어 원본을 알아볼 수 없게 된다. 알고 있는 암호화는 암호화와 복호화가 한 세트인 '원본 보존이 가능한' 암호화였다면 해시 함수는 한 번 해싱했다면, 그 해싱된 값을 통해 입력값을 유추할 수 있다. 이러한 특성 때문에 단방향 암호라고 부른다.
해싱은 다양한 크기의 입력값을 고정된 크기의 출력값으로 생성해내는 과정을 의미한다. 해시 함수는 어떠한 크기의 입력이 들어와도 동일한 크기의 출력을 뱉는 함수이다. 원본이 조금이라도 바뀌어도 결괏값이 전혀 달라지며, 출력값을 통해 입력값을 유추할 수 없다. 오늘날에는 여러 종류의 해시 함수가 존재하며, 그 중 암호 해시 함수는 블록체인 및 다양한 분산 시스템에 데이터 무결성과 보안을 보장하는 데 사용된다.
✓ 해시 함수의 동작방식
해시 함수는 다양한 크기의 입력값을 사용해 고정된 크기의 출력값을 생성한다. 가령 SHA-256 알고리즘은 어떤 입력값을 넣어도 256 비트 길이의 값을 출력하며, SAH-1은 160 비트 길이의 값을 출력한다. 해시 함수의 내부 알고리즘은 매우 어려워서 다 알기란 힘들지만, 아주 간단하게 유사한 예시를 들자면, 어떤 데이터를 n으로 나눈 몫의 소수점 2자리에서 10자리까지의 숫자를 출력하는 연산이 있다고 가정했을 때, 28374239 라는 데이터의 소수점 2~10 자리인 88227301 이라는 출력값을 도출하는 것과 유사한 동작 방식을 취한다.
✓블록체인에서 해싱의 역할
기존의 해싱은 데이터베이스 조회, 파일 분석, 데이터 관리 등에 사용되어 왔다. 반면, 암호 해시 함수는 메시지 인증, 디지털 서명 등 봉안 애플리케이션에 사용될 수 있다. 특히, 암호화폐 프로토콜에서 가장 중요한 기술 중 하나로, 사용자에게 익명성을 보장하고, 트랜잭션을 하나로 연결 및 압축하며, 블록을 연결하는 동시에 그 무결성을 보장하는 역할을 한다.
1. 해시값을 이용해 익명성 보장
공개키를 해싱한 값을 지갑 주소로 사용하여 거래를 익명화할 수 있다. 트랜잭션 기록에는 해시값으로 암호화된 지갑 주소와 송금 및 잔액을 확인할 수 있을 뿐, 해당 지갑의 주인이 누구인지 파악할 수는 없다.
2. 무결성 검증
입력값이 조금이라도 다르면 출력값이 변하는 해시 함수의 특성을 블록체인에서 무결성을 검증하는 경우 모든 데이터를 대조할 필요 없이, 고정된 크기의 해시값을 비교하면 되기 때문에 많은 양의 데이터를 저장하거나 기억할 필요 없이 무결성을 검증할 수 있다.
(1) 블록의 헤더에 있는 '이전 블록 해시'는 '이전 블록의 값을 해싱한 값' 을 사용해 이전 블록을 가리킨다. 만약 이전 블록을 해싱한 값이 달라진 경우, ** 해당 블록 또는 가리키고 있던 이전 블록에 위변조가 일어났음을 알 수 있다.
(2) 블록에 저장된 모든 트랜잭션을 머클 트리 알고리즘을 사용해 하나의 해시값으로 저장하여 '머클 루트'를 만든다. 만약, 트랜잭션이 하나라도 변한 경우, ** 머클 루트의 값이 변했다는 것을 통해 위변조가 일어났음을 알 수 있다.
(3) 입력값을 일정한 길이의 값으로 축약해 주는 특성을 사용하여 대용량 파일의 문서를 해싱한 뒤, 해싱된 값만 비교하여 위변조가 일어났음을 알 수 있다.
3. 해시값을 사용해 채굴 노드를 정함
최초의 블록체인 암호화폐인 비트코인에서는 PoW(작업 증명) 방식을 사용해 어떤 노드가 블록을 만들지 정한다. 작업 증명 방식에서는 특정 조건을 만족하는 해시값을 만족하기 위해 입력값이 논스를 찾아야 한다. 이를 가장 먼저 찾는 노드에게 블록을 채굴할 권할을 주며 채굴에 대한 보상으로 비트코인을 제공한다.
✓ 암호 해시 함수
블록체인에서 사용되는 해시 함수는 단방향 알고리즘을 사용하고, 입력값이 조금만 달라져도 아예 다른 형태로 변하기 때문에, 해싱된 값을 이용하여 기존의 값을 찾기란 매우 어렵다. 그렇기에 해시 함수는 일방향, 일반적으로 암호 해시 함수를 복호화하기 위해서는 수많은 무차별 대입을 시도해야 한다. 그러나 이러한 해시 함수에는 약점은 있다.
해시 함수의 특징 중 하나인 항상 고정된 길이의 출력값 때문에 한 가지 문제점이 발생한다. 서로 다른 입력값을 해시 함수에 넣었는데 동일한 출력값을 내뱉는 경우이다. 이를 해시 충돌이라고 한다. 해시 충돌은 시스템에 심각한 위협이 될 수 있기 때문에 충돌은 해시 함수를 만들 때 가장 중요한 요소 중 하나로 작용한다. 이를 종합해보면 암호 해시 함수의 안정성을 평가하는 요소를 1) 충돌 저항성, 2) 역상 저항성, 3) 제2 역상 저항성 으로 볼 수 있다.
* 충돌 저항성
서로 다른 입력값이 동일한 출력을 갖게 되는 것을 충돌이라고 한다. 충돌 저항성은 어떤 해시 함수가 충돌하는 서로 다른 두 입력값을 가졌는지 발견되지 않은 상태를 의미한다. 이는 마치 사람의 지문과 같다. 지문은 완전히 같을 확률이 적기 때문에, 사람을 식별할 때 주민번호를 일일이 입력하는 대신 지문을 사용할 수 있다. 사실상 해시 함수의 입력값은 그 길이와 종류가 무안하지만, 입력값은 유한하기 때문에 누군가가 충돌하는 두 입력값을 발견할 가능성도 있다. 그러나 해시 함수의 충돌을 발견할 가능성은 매우 적다. 가령 SHA-256의 출력값의 자리에는 0~9, a~f 사이의 16진수가 하나 들어가며, 총 길이는 64자리로, 비트로 환산하면 256비트가 되며 경우의 수는 2^256이 된다. 2^256은 10^78 정도 된다. 우주의 모든 원자의 개수가 10^80개라는 것을 감안하면 사실상 SHA-256의 충돌을 찾는 것은 불가능에 가깝다. 따라서 충돌이 없는 해시 함수는 존재하지 않지만, 충돌 저항성이 있다고 간주되는 해시 함수는 존재한다.
이론적으로 양자 컴퓨터를 사용하게 된다면, 계산 성능을 획기적으로 늘리는 것이 가능하기 때문에 2^256개의 가능성을 일일히 대입하는 것은 어렵지 않을 것이다. 그러나 양자 컴퓨터가 어느 순간 갑자기 보편화될 가능성은 적기 때문에 지금 당장 걱정할 필요는 없다.
* 역상 저항성
역상 저항성은 어떤 해시 함수가 특정한 값을 출력하는 입력값을 찾을 확률이 매우 낮을 경우를 의미한다. 이는 단방향 함수의 성질과 연관된다. 단방향 함수는 입력값을 통해 출력값을 얻을 수는 있지만, 출력값을 통해 입력값을 얻을 수는 없는 함수이다. 역상 저항성은 데이터를 보호하는 데 매우 유리하다. 메시지의 해시값을 사용하면 해당 메시지의 원본을 공개하지 않고도 진위성을 검증할 수 있기 때문이다. 실제로 패스워드에 대한 진위성을 검증할 때도 패스워드 원문을 비교하지 않고, 패스워드를 해싱한 값을 사용하여 패스워드가 노출되는 것을 방지한다.
* 제2 역상 저항성
제2 역상 저항성은 충돌 저항성과 역상 저항성이 복합적으로 작용한 경우로, A라는 입력값의 해시값과 동일한 해시값을 내는 B 입력값을 누군가가 알고 있지 않은 경우이다. 반대로 이 B 입력값을 누군가가 발견한 경우 제 2 역상 곡격이 가능하다. 충돌 가능성은 동일한 해시값을 가진 서로 다른 두 입력값을 찾는 것이지만, 제2 역상 공격은 A 입력값을 통해 A'라는 해시값이 나왔을 때, A' 해시값을 출력하게 만드는 B 입력값을 찾는 것이다. 따라서 제 2 역상 저항성은 충돌 저항성이 전제되어야 한다.
'블록체인 > 블록체인이란?' 카테고리의 다른 글
머클트리가 무결성을 보장하는 방법 (0) | 2022.06.22 |
---|---|
머클트리란? 머클트리의 동박방식 (0) | 2022.06.22 |
니모닉(Mnemonic), 니모닉 코드와 시드 생성 9단계, 솔팅(salting), 키 스트레칭(key stretching) (0) | 2022.06.21 |
테스트넷을 사용하여 이더리움 입금 & 송금, 롭스텐 테스트넷 이용 (0) | 2022.06.21 |
메타마스크(Metamask)란? 크롬 브라우저에서 메타 마스크 사용하기 (0) | 2022.06.21 |
댓글