본문 바로가기

암호학..진로..등등

해시와 레인보우 테이블

webhacking.kr의 문제중 4단계에 있는 문제가 있다. 페이지에 주어진 해시화 된 암호문을 평문으로 바꾸고 그것을 입력하면 문제가 해결되는 단계이다.

이 문제를 풀면서 해시를 접하게 되었고, 해시에 대해 정리하기 위해 이 블로그를 쓰게 되었다.

 

* 해시(hash): 임의의 길이를 가지고 있는 데이터(평문)를 고정된 길이의 데이터로 바꾸어주는 함수를 의미한다.

 

이해가 안된다면 예시를 들어서 생각해보자.

 

"나는 우주가 좋아요."라는 문장이 있다고 해보자.

이때 이 문장을 해시화 하면 1qwsdf43e8f이 된다.

 

다른 문장도 보자면

"사과는 폭력을 싫어해요."라는 문장을 58psdf543e8f라는 정해진 길이의 데이터로 바꾸어 준것이다.

'1qwsdf43e8f', '58psdf543e8f'는 같은 길이를 가지고 있는 데이터로 바뀌어 저장되는것이다.

 

 

*해시의 특징

1. 해시 알고리즘의 종류에 따라 변환되는 길이와 방법이 달라짐

2. 해시로 변환시 중복되는 값이 없음

3. 주소계산이 빠름

4. 단방향으로 되어있어 복호화가 불가능하다.

5. 같은 문자는 같은 다이제스트(해시값)를 가진다.

 

+) 해시 함수에는 무엇이 있을까?

여기있는 예시보다 더 많은 종류가 있지만 대표적으로

MD5

SHA-1

SHA-2(SHA256, SHA384, SHA512)

SHA3(SHA3-256, SHA3-384, SHA3-512

이 있다.

 

*레인보우 테이블

해시로 변환한 값을 대량으로 저장한 데이터를 의미한다.

보통 해시 함수로 변환된 값을 이용하여 비밀번호를 찾는데 이용된다.

 

*솔트(salt)

해시를 이용해 암호화 했을 때의 문제점은 무차별 대입공격에 약할 수 있다는것이다.

위에서 말했듯이 같은 문자는 같은 해시값을 가지므로 해커는 평문을 계속해서 해시화 시켜 얻은 다이제스트와 비밀번호의 해시값을 비교하는 과정을 통해 비밀번호 값을 얻을 수 있다는...것이다.

 

그래서 나온 방법이 '솔트(salt)'라는것이다.

 

'salt' 를 영문 그대로 해석하면 소금. 음식에 소금쳐서 맛을 더하는 것처럼, 평문에 소금쳐서 해시화 시켜 결과값을 얻어도 무엇인지 알아볼 수 없도록 하는 과정이다.

평문 "이 글을 읽는 모두 행복해지세요"가 있을때 이것을 sha256을 통해 해시화 시켜주면 

'81CCE56F6BF00E4B8798F79408FED3C7770ABA5AEB517AC91FAB741BD93634DA'라는 값을 얻을 수 있다.

이때 솔트를 조금 쳐주어 "이런 글우을 읽구는 모나두 행마복지해지마세요"라는 평문을 얻고

(이건 어디까지나 예시일뿐. 진짜 이렇게 되진 않는다는것을 참고하길), 이것을 해시화 시키면

'DF47DD088F865161C16CED3AC7E8A4042B1DA2351C132F2EAADB111EDAB0B534'라는 값을 얻었다.

 

끝!