Digital_forensic/Theory

해시 함수(Hash Function)

neck392 2024. 1. 25. 23:50

 Hash는 전자 정보를 암호학적 수학연산을 통해 고정된 짧은 길이로 변환 한 값을 말한다. 디지털 데이터는 다른 물적 증거들과 달리 변경 및 삭제가 매우 용이하며 훼손되기 매우 쉽다. 간단한 도구를 사용하여 거의 완벽하게 위, 변조가 가능하다. 당장 전문적인 지식 없이 윈도우 OS‘CTRL+C’‘CTRL+V’ 같은 단축키를 활용하는 등 누구나 손쉽게 데이터를 복사하여 위, 변조할 수도 있다. 따라서 디지털 데이터를 획득한 이후부터는 위, 변조되지 않았음을 입증할 수단이 필요하다.

 

 전자 서명 기법을 구성하는 요소로 해시 함수(Hash Function)가 있다. 해시 함수는 단방향 알고리즘으로 역변환이 어려워 무결성 확인 수단으로 많이 사용한다. 대부분의 디지털 포렌식 도구에서 무결성을 확인하는 수단으로 해시 함수 기능을 제공하며 포렌식 분석 프로그램을 통한 별도의 절차와 결합하여 무결성을 유지하는 데 사용된다.

 

 단방향 알고리즘은 평문(Plain Text) 암호화는 가능하지만, 암호문을 평문으로 복호화가 불가능한 알고리즘이다. 암호화만 가능하기 때문에 단방향 암호화라고도 부른다. 단방향 알고리즘은 기본적으로 계정의 패스워드를 암호화해서 저장할 때 사용한다. 클라이언트가 계정을 생성할 때 단방향 알고리즘으로 패스워드를 암호화해서 암호문(Cipher Text)을 만들고 이것을 암호문 그대로 데이터에 저장한다. 클라이언트는 입력한 패스워드를 동일한 알고리즘으로 암호화 한 후 서버에 저장 된 암호화 된 패스워드 데이터와 비교해서 확인하면 로그인 검증을 할 수 있다. 만약 클라이언트가 패스워드를 잃어버렸다면 복호화가 불가능하기 때문에, 패스워드의 실제 평문을 찾을 수는 없다. 대신에 우리가 자주 겪어봤던 이메일이나 SMS 본인인증 등을 통해 암호화된 패스워드 자체를 변경해주면 된다.

 

 단방향 알고리즘 중에 하나인 해시 함수는 임의의 크기를 가진 데이터를 고정된 데이터의 크기로 변환시키는 함수를 뜻한다. 그렇기 때문에 입력 값의 길이가 달라도 출력 값의 길이는 고정되어 있다. 동일한 값이 입력되면 언제나 동일한 해시 값으로 출력이 되기 때문에, 이를 저장해서 검증하는데 사용이 가능하다.

 

 해시 함수의 결과인 고정된 길이의 출력 값을 해시 코드(Hash Code) 또는 체크섬(Checksum), 메시지 다이제스트( Message Digest ) 등으로도 칭한다. 위와 같은 이름에서 알 수 있듯이 임의의 길이의 메시지를 대신 대표할 수 있는 고정된(일정한) 길이의 값을 계산하여 주는 함수이다. 일반적으로 해시 함수는 y = h(x)으로 표시한다. X는 평문(입력 값, 서명문, 데이터), h(x)는 해시함수, y는 해시 값이다. 가령, h(x) = y에서 x는 가변 길이의 메시지이고, y는 함수 h(x)를 통하여 생성되는 고정 길이의 압축 값(Compression Code)이다. 위 해시코드는 객체가 가지는 유일한 값으로써, 객체의 ID에 해당하는 것이며 해시함수의 출력 비트 문자열로 표현된다.

 

 해시는 평문(데이터)이 해시 알고리즘에 의해 해시 값으로 바뀌게 되는데, 조금이라도 평문이 다르면 해시 값도 달라지게 된다. , 해시함수는 결정론적으로 작동해야 하고, 따라서 두 해시 값이 다르다면 그 해시 값에 대한 원래 데이터도 달라야 한다. 이러한 함수를 사용하는 목적은 입력 메시지(데이터)에 대한 변경할 수 없는 증거 값을 뽑아냄으로써 메시지(데이터)의 오류나 변조를 탐지할 수 있는 무결성을 제공하기 위해서이다. 무결성 입증방법은 수학적 해시 함수를 이용한 원본과 사본의 결과 값을 비교하는 방법이 가장 일반적이라고 하며, 해시함수의 특성상 입력 데이터가 한 bit라도 변경되면 다른 결과값이 출력되므로, 쉽게 변조가 되는 디지털 데이터라도 무결성을 입증할 수 있다. 이처럼 해시 알고리즘 내지 해시 함수는 데이터 무결성 및 메시지 인증 등에서 사용할 수 있는 함수로써, 메시지의 변조나 원본 메시지의 대체(substition)를 방지하기 위해 사용된다.


 

- MD5 - Message Digest algorithm 5(Deprecated)

  Message Digest는 메시지를 해시(Hash) 하는 것을 의미한다. 임의의 길이를 가진 메시지를 MD함수에 넣으면 일정한 길이를 가진 데이터를 얻는다. MD5는 기존 MD4를 대체하기 위해 고안했다고 한다. 1996년에 설계상 결함을 발견했는데, 이 때부터 SHA-1과 같은 다른 알고리즘을 권장하기 시작했다. 그리고 2004년에는 심각한 결함을 발견하게 되었다. 200812월에는 MD5의 결함을 이용해 SSL 인증서를 변조하는 것이 가능하다는 것이 발표되었다. 현재는 MD5 알고리즘을 보안 관련 용도로 쓰는 것은 권장하지 않으며, 심각한 보안 문제를 야기할 수도 있다.


- SHA-1, SHA-2, SHA-256

 SHA(Secure Hash Algorithm) 함수들은 서로 관련된 암호학적 해시 함수들의 모음이다. SHA 함수군에 속하는 최초의 함수는 공식적으로 SHA라고 불리지만, 나중에 설계된 함수들과 구별하기 위하여 SHA-0이라고도 불린다. 2년 후 SHA-0의 변형인 SHA-1이 발표되었으며, 그 후에 4종류의 변형, SHA-224, SHA-256, SHA-384, SHA-512가 더 발표되었다. 이들을 통칭해서 SHA-2라고 하기도 한다.

 그 중에서 SHA-256SHA 알고리즘의 한 종류로서 256비트로 구성되며 64자리 문자열을 반환한다. 미국의 국립표준기술연구소(NIST; National Institute of Standards and Technology)에 의해 공표된 표준 해시 알고리즘인 SHA-2 계열 중 하나이며 이름에 내포되어 있든 2^256만큼 경우의 수를 만들 수 있다. 개인용 컴퓨터로 무차별 대입을 수행해 충돌 사례를 찾으려고 할 때 많은 시간이 소요될 정도로 큰 숫자이므로 충돌(Collision)로부터 비교적 안전하다고 평가된다.

 SHA-256 해시 함수는 어떤 길이의 값을 입력하더라도 256비트의 고정된 결과값을 출력한다. 일반적으로 입력 값이 조금만 변동하여도 출력 값이 완전히 달라지기 때문에 출력 값을 토대로 입력 값을 유추하는 것은 거의 불가능하다. 아주 작은 확률로 입력 값이 다름에도 불구하고 출력 값이 같은 경우가 발생하는데 이것을 충돌(Collision)이라고 한다. 이러한 충돌의 발생하는 이유는 입력의 크기는 무한하지만 출력의 크기는 유한하기에 동일한 출력을 내는 서로 다른 입력이 존재하기 때문이다. 따라서 해시 함수의 값이 같다고 해서 실제 데이터가 같다고 간주할 수는 없다. 이러한 충돌 저항성(Collision resistance)이 높을수록 좋은 함수이다.

 SHA-256 출력속도가 빠르다는 장점을 갖고 있으며 SHA-384, SHA-512, SHA-3보다는 유효 보호 수준이 낮을 지는 모르지만, 현재까지 안정성 문제에서도 큰 단점이 발견되지 않았고, 속도가 빠르기 때문에 인증서, 블록체인 등 많이 사용되고 있으며, SHA-2라고 하면 SHA-256이라고 말할 정도로 상용화가 잘 되어있다.


Reference

Hash :

https://blog.naver.com/PostView.nhn?blogId=poon2963&logNo=222203993717&parentCategoryNo=&categoryNo=13&viewDate=&isShowPopularPosts=true&from=search

Hash Function : https://bimmm.tistory.com/55

MD5 : https://ko.wikipedia.org/wiki/MD5

SHA : https://losskatsu.github.io/blockchain/sha256/#