해시함수의 기본적인 내용에 대해서는 이전 글(http://sevity.tistory.com/21) 참조


자세한 설명에 들어가기전에 다음 예제를 살펴보자.

철수는 영희에게 중요한 문서를 전달할 예정이다.

그런데 누군가 중간에서 그 문서의 내용을 해킹으로 바꿀 수 있기 때문에, 문서내용에 대해서

(string to int) hash function을 적용해서 오프라인으로 해시값을 알려주기로 했다. 

이 해시값을 42라고 해보자.

영희는 문서를 전달받은다음, 철수와 동일한 hash function을 적용해서 42라는 값을 얻었고, 문서가 해킹당하지 않았음을 확신했다.


위와 같은 시나리오로 보안에서 해시가 사용되는 거시다.


그런데 만약 해시값인 42로 부터 원본 문서의 내용을 일부라도 유추할 수 있다면 어떻게 될까..

예를 들어 해시값이 4로 시작하면 원본 문서의 내용에 money라는 단어가 들어간다던가..

이런일이 있으면 안되기 때문에 해시값으로 부터 원본의 내용을 찾는게 계산상 어렵도록 hash function을 설계해야 한다.

이러한 공격을 제1역상 공격이라 하며, 이에 저항하기 위해 hash function이 가져야 하는 성질을 제1역상저항성(preimage resistance)이라 한다.


그런데, 또 다른 예를 살펴보자.

해커가 제1역상 공격을 통해 원본 내용을 찾는것은 불가능하더라도, 

여러가지 문서들을 hash function에 넣어보면서 42라는 같은 결과가 나오는 전혀다른 문서를 찾는다면 어떻게 될까?

이런게 가능하다면 영희는 해시값이 42로 동일하기 때문에 문서내용이 바뀌어도 모를 수 있을 것이다.

(단 이런 공격을 시도 하려면 hash function이 공개되어 철수/영희가 사용하는 것과 해커가 사용하는게 같아야 한다는 전재조건이 붙는다)

위와 같은 공격을 제2역상공격이라 하며, 이를 막기위해 입력의 해시 값을 바꾸지 않으면서 입력을 변경하는 것이 계산상 어렵도록 hash 함수를 설계해야 하며 이를 제2역상저항성(second preimage resistance)이라 한다.


위의 제2역상 공격은 사실 해시 함수의 충돌(collision)이라는 약점을 파고드는 것인데,

해시 함수는 더 큰 인풋(문서내용)을 더 작은 아웃풋(숫자하나)로 바꾸는 과정이기 때문에 충돌이 아예 없을수는 없다.

하지만 같은 해시 값을 생성하는 두 개의 입력값을 찾는 것이 계산상 어려워야 하며 이를 충돌 저항성(collision resistance)이라 부른다.

즉, 입력값과 해시 값에 대해서, 해시 값을 망가뜨리지 않으면서 입력값을 수정하는 공격에 대해 안전해야 한다. 이러한 성질을 가지는 해시 값은 원래 입력값을 의도적으로 손상시키지 않았는지에 대한 검증 장치로 사용할 수 있다.


좀더 알기쉽게 표현하자면 인풋의 일부만 바뀌어도 결과값이 크게 바뀔때 위의 속성들을 만족하는 좋은 해시라고 보통 표현을 하게된다.


또다른 예로는 패스워드를 암호화하는 것을 들 수 있다.

일방향이고 리버스 엔지니어링이 힘들다는 역상저항성을 활용해서, 주민번호나 패스워드를 직접 DB에 저장하는 대신 해시값을 저장하게 되면,

운영자에게 비밀번호나 주민번호를 노출하지는 않으면서도 로그인 보안은 구현할 수 있게 된다.

(물론 여기서도 전혀다른 비밀번호가 같은 해시값을 도출하게되는 제2역상공격이 성공하게 되면 큰일이다)

반응형

'비트코인' 카테고리의 다른 글

비트코인 논문 리뷰  (0) 2021.08.31
블럭체인의 원리  (0) 2020.07.31
md5, sha  (0) 2017.12.12
비트코인 분석 연재를 시작하며  (0) 2017.12.10
hash 기초  (0) 2017.12.10

+ Recent posts