이제 드디어 현대 컴퓨팅 파워 수작업(?)의 계산으로 SHA1의 hash value collision을 알아 낼 수 있는 시대가 되었다. 이러한 것을 삽질로 입증한 사람들에게 일단 박수 짝짝짝!!!


http://www.dailysecu.com/?mod=news&act=articleView&idxno=18782


Collision-illustrated.png


이게 무슨 말인고 하니, SHA1 기반으로 인증을 하고 있는 많은 곳에 큰 타격을 줄 수 있다는 것이다. 가장 대표적인 것이 바로 인증서 서명이다. 자기 자신 브라우저에서 제공하는 Root CA들을 봐도 아직도 Certificate Signature Algorithm에 SHA1 기반의 인증서들이 많이 있다. 이는 굉장히 심각한 문제이며, 하루 속히 많은 인증서들이 SHA1이 아닌 다른 hash function으로 인증을 하도록 많은 인증서들을 하루 속히 물갈이시켜야 한다.


그런데 여기에서 중요한 것은 SHA1의 collsion이 쉬워 질 수 있다는 것이 입증되었다 해서 SHA1을 무조건 폄하해서는 안된다는 것이다. 이렇게 SHA1을 폄하하는 사람들 중에 SHA1이 실제 어떻게 실생활에 사용되어 지는지 제대로 이해하는 인간은 별로 없다. 그냥 주위에서 들은 얘기만 가지고 "SHA1은 쓰면 안되요" 라고 단정지어 얘기를 한다. 그 예를 몇가지 들어 보고자 한다.




1. 일반 사용자의 비밀번호의 처리


일부 웹사이트의 경우에는 사용자의 암호를 평문으로 저장하지 않고 암호에 대한 hash value를 저장하여 처리하는 경우가 있다(여기에 salt라는 양념까지 조금 쳐서). 이렇게 하는 이유는 DB가 털려 간다 하더라도 사용자의 암호를 직접 알아 낼 수는 없기 때문에 일반적으로 선호하는 방식이다. 또한 네트워크 레벨에서도 사용자가 입력한 암호를 hash value로 바꾼 다음 송수신하는 경우도 있다. 네트워크에서 패킷이 노출된다 하더라도 hash value만 송수신되기 때문에 평문을 넘기는 것보다는 안전하다(가장 대표적인 예가 바로 SIP register).


아무튼 DB 기반이던지, 네트워크 기반이던지 attacker가 특정 사용자에 대한 hash value을 획득했다라고 한다면 그 암호를 알아 내고 싶어하게 되다. 이러한 경우 공격자는 일반적으로 dictionary 기반의 brute-force attack 기법을 사용한다(간혹 rainbow table을 사용하기도 한다). 여기에서 중요한 것은 brute-force attack의 경우에는 어떠한 hash function을 사용했는지는 그리 중요하지 않다는 것이다. 대신에 얼마나 효율적인 dictionary를 구성하느냐가 더 중요하다. 인터넷을 돌아 다니다 보면 다음과 같이 오류를 범하는 얘기하는 경우를 적지 않게 볼 수 있다.


"MD5는 hash collision의 위험성이 알려 졌기 때문에 암호를 저장할 때 더 나은 hash를 사용해야 해요. 그렇지 않으면 brute-force attack에 쉽게 깨질 수 있습니다."


dictionary brute-force attack이 성공하기 위해서는 어떠한 hash function을 사용하는지 혹은 hash의 길이가 128bit인지, 320bit인지는 중요하지 않다. 실제 암호는 다른데 정말로 재수가 좋아서 hash value가 똑같아 지는 경우는 가뭄에 콩나는 정도이고, 대신에 얼마나 dictionary를 효율적이고 적중률이 높은 것을 사용하느냐가 더 큰 관건이다.


hash function을 바꾸어야만 brute-force attack에서는 더 안전해 진다라고 얘기하는 것은 "MD5, SHA1이 깨졌다"라는 기사를 잘못 이해하고 있는 단적인 예 중의 하나이다.




2. hash map 처리


국내 SI 프로젝트에서는 감리사라고 보통 교수나 기술사 자격을 가진 사람이 프로젝트의 막바지에 이런 저런 훈수를 두는 경우가 있는데, 이건 내가 직접 경험했던 얘기이다. 사용하는 hash map에 맞는 적당한 hash function을 직접 만들었더니 well-known hash를 쓰란다. ㅅㅂ. MD5를 사용했는데 이후 그 감리사라는 사람이 딴지를 건다.


A(감리사) : 이게 무슨 함수에요?

B(나) : MD5요.

A : MD5는 이제 더 이상 안정하지 않으니 고치도록 하세요.

B : hash map에서 index 충돌은 bucket count 제한에 기인한 경우가 더 많아요. 지금도 충분한데 굳이 hash function을 바꿀 필요는 없다고 봅니다.

A : 그래도 무조건 다른 hash function을 사용하도록 하세요.

B : 왜죠? 

A : 요즘 기사들 보면 MD5는 안정하지 않다고 하잖아요.

B : -_-;


이렇게 얘기하는 사람들 중에 제대로 프로그래밍을 해 본 사람은 없다. hash의 역할이 뭔지도 모르고, collision 났을 때 대처하는 방식도 제대로 알지 못한다.




오랫 동안 hash function으로 사랑을 받던 MD5가 이제는 무슨 대역 죄인이 된 것처럼 여겨지게 된 지가 오래. SHA1도 이제 그 꼴 날 듯.



결론 : hash function 폄하하는 건 좋은데, 까려면 제대로 알고 까자.