본문으로 바로가기

비밀번호와 Hash(해시)

category 보안 2017. 8. 22. 22:51
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.




비밀번호와 Hash(해시)







잦은 개인정보 유출 사고로 보안이 이슈되면서 개인정보와 패스워드에 대한 보안이 철저해지고 있습니다. 

또한 현재 핀테크 관련된 개발을 하게 되면서 알고 있던 내용을 정리하고자 간략하게 포스팅을 하게 되었습니다.


보안시스템에 취약과 관련된 다양한 사례는 인터넷으로 검색하면 많이 나오고 있습니다. 예를들어 2010년대 초 비즈니스 전문 소셜 네트워크 서비스는 대량의 사용자 데이터가 해킹되어 집단 소송을 당했고, 취약한 알고리즘은 SHA-1을 사용했다는 것이 그 이유였습니다. 이 사례뿐만 아니라 인터넷을 찾아보면 다양한 해킹사례를 알 수 있고 지금은 암호화 알고리즘으로 어떤 알고리즘을 선택했는지 중요한 요소가 되었습니다.


먼저 해시와 암호화에 대해서 간단하게 구분하고 고객정보마다 암호화와 해시를 이용해야한다는 것을 밑에서 설명드리겠습니다.



암호화 

기본적으로 양방향 통신을 전제로 하므로 암호화와 복호화가 가능해야 합니다. 복호화되지 않는 암호화는 의미가 없는 것입니다. 복호화를 전제로 양방향 통신을 위한 것이 암호화라고 할 수 있습니다.

고객정보에서 암호화해야하는 데이터는 전화번호와 주소가 있습니다. 고객정보를 암호화를 하여 서버에 전송한 후 서버에서 복호화하여 DB에 insert하게 됩니다. 그래야 고객에게 물건을 전달하거나 문자를 보낼 수 있겠죠.



해시(Hash)

메세지를 고정된 길의의 문자열로 변환합니다. 헤쉬를 통해 생성된 Message Digest는 복호화될 필요가 없습니다. 

해시는 메세지마다 다른 내용의 Message Digest를 만들기 때문에 메세지의 지문(fingerprint)으로 볼 수 있습니다. 또한 고정된 길이의 문자열을 생성하고 복호화를 할 수 없고, 암호화에 비해 연산이 빠릅니다.

고객정보에서 어떤 데이터가 해시를 사용하여 DB에 insert가 되냐면 비밀번호입니다. 고객의 비밀번호 평균적으로 다른 사이트의 비밀번호와 유사하거나 똑같습니다. 때문에 하나라도 유출되면 나머지 사이트의 고객정보도 위험해집니다.

그렇다면 비밀번호를 해시 알고리즘을 활용하여 문자열로 변환한다면..? 해시는 복호화가 불가능하니 원본의 패스워드를 알 수가 없습니다. 이런 이유로 비밀번호는 해시 알고리즘을 사용합니다. 



대표적인 해쉬 함수 2가지에 대해 간략하게 정리해보았습니다.


MD5

MD5 (Message-Digest algorithm 5) MD5는 메세지 축약 알고리즘으로써, 파일 무결성 검사용도로 많이 쓰이고 있습니다.

128bit 의 해쉬를 제공하며, 암호와와 복호화를 통하여 보안용도로도 많이 쓰입니다. 하지만 암호화 결함이 발견되어 보안 용도로 사용할때에는 SHA와 같은 다른 알고리즘을 사용하는것이 권장되고 있다고 합니다.


SHA

SHA (Sechre Hash Standard) SHA(Secure Hash Algorithm, 안전한 해시 알고리즘) 함수들은 서로 관련된 암호학적 해시 함수들의 모음이다. 여러 종류가 존재하며 그중 SHA-256은 SHA 함수들 중 가장 많이 쓰이며, TLS, SSL,PGP, SSH, IPSec 등 많은 보안 프로토콜과 프로그램에서 사용되고 있습니다. 


[대표적인 해쉬함수와 보안 강도별 분류 - KISA]

 

 HAS-160

SHA-1 

SHA-2 

SHA-224 

SHA-256 

SHA-384 

SHA-512 

 Hash길이

160 

160 

224 

256 

384 

512 



 보안강도

해쉬함수 

권고여부 

80bit 미만 

 MD5, SHA-1

 권고하지 않음

80bit

 HAS-160 

112bit 

 SHA-224

 권고함

128bit 

 SHA-256

192bit 

 SHA-384

256bit 

 SHA-512



단방향 해쉬 함수

단방향 해시 함수는 수학적인 연산을 통해 원본 메시지를 변환하여 다이제스트(digest, 암호화된 메시지)를 생성합니다. 현재 다이제스트를 수학적으로 계산하여 다시 원본 메시지로 변환하는 것은 존재하지 않습니다. 이를 단방향성이라고 합니다.


단방향 해쉬 함수의 문제점

대부분의 웹 사이트에서는 SHA-256과 같은 해시 함수를 사용해 패스워드를 암호화해 저장하고 값을 비교하는 것만으로 충분한 암호화 메커니즘을 적용했다고 생각하지만, 실제로는 다음과 같은 두 가지 문제점이 있습니다.


인식 가능성(recognizability)

동일한 메시지가 언제나 동일한 다이제스트를 갖는다면, 공격자가 전처리(pre-computing)된 다이제스트를 가능한 한 많이 확보한 다음 이를 탈취한 다이제스트와 비교해 원본 메시지를 찾아내거나 동일한 효과의 메시지를 찾을 수 있습니다. 이와 같은 다이제스트 목록을 레인보우 테이블(rainbow table)이라 하고, 이와 같은 공격 방식을 레인보우 공격(rainbow attack)이라 합니다. 게다가 다른 사용자의 패스워드가 같으면 다이제스트도 같으므로 한꺼번에 모두 정보가 탈취될 수 있습니다.


속도(speed)

해시 함수는 암호학에서 널리 사용되지만 원래 패스워드를 저장하기 위해서 설계된 것이 아니라 짧은 시간에 데이터를 검색하기 위해 설계된 것입니다. 바로 여기에서 문제가 발생합니다. 해시 함수의 빠른 처리 속도로 인해 공격자는 매우 빠른 속도로 임의의 문자열의 다이제스트와 해킹할 대상의 다이제스트를 비교할 수 있습니다(MD5를 사용한 경우 일반적인 장비를 이용하여 1초당 56억 개의 다이제스트를 대입할 수 있습니다).

이런 방식으로 패스워드를 추측하면 패스워드가 충분히 길거나 복잡하지 않은 경우에는 그리 긴 시간이 걸리지 않습니다. 그리고 대부분 사용자의 패스워드는 길거나 복잡하지 않을 뿐 아니라, 동일한 패스워드를 사용하는 경우도 많습니다.                                                    반면 사용자는 웹 사이트에서 패스워드를 인증하는 데 걸리는 시간에는 그리 민감하지 않습니다. 사용자가 로그인하기 위해 아이디와 패스워드를 입력하고 확인 버튼을 누르는 과정에 10초가 걸린다고 가정했을 때, 다이제스트를 생성하는 데 0.1초 대신 1초가 소요된다고 해서 크게 신경 쓰는 사람은 많지 않습니다. 즉, 해시 함수의 빠른 처리 속도는 사용자들보다 공격자들에게 더 큰 편의성을 제공하게 됩니다.



단방향 해쉬 함수 보완하기


스트래칭

출처 - http://d2.naver.com/helloworld/318732


스트레칭은 복잡한 연산을 반복 적용하는 것을 의미합니다. 즉, 암호화 해시 함수를 수천 번에서 혹은 수만 번을 반복하는 것이죠. 이는 무작위 공격으로 비밀번호를 추측하는 데 많은 시간이 소요되도록 하는 방법으로, 반복 횟수를 늘리는 것만으로도 방어력을 효과적으로 높일 수 있다는 장점이 있습니다.

 


비밀번호와 Salt


출처 - KISA



솔트는 32비트 이상의 문자열로, 사용자마다 서로 다른 값이 부여됩니다. 위 그림처럼 비밀번호 앞 또는 뒤에 이 문자열을 추가하여 다이제스트를 생성하는 것을 소금치기, 즉 솔팅(Salting)이라고 합니다. 만일 100명의 사용자가 “ITWorld08” 이라는 비밀번호를 보유했다고 하더라도 솔팅 작업을 거치면 100개의 서로 다른 다이제스트를 생성할 수 있습니다. 동일한 비밀번호에 대해 항상 동일한 다이제스트가 생성하는 해시 함수의 문제점을 보완해주는 것이죠.

이와 같은 2가지 조치를 취하면 고사양 GPU를 탑재한 컴퓨터를 갖추고도 초당 30건의 다이제스트만 겨우 대입해볼 수 있습니다. 그렇지 않을 경우에는 10억 단위로도 처리가능한 데 말이죠. 아스 테크니카(Ars Technica)의 보도에 따르면, 30건도 무리라며 초당 10회 정도 테스트할 수 있을 것이라고 추정됩니다.

동일한 비밀번호이더라도 다른 해쉬결과를 얻기 위해 Salt라는 비밀값을 추가하여 해쉬함수를 적용한다.

사용자별로 다른 Salt값을 적용하면 비밀번호만 해싱하는것에 비해 비밀번호 사전공격 취약점을 해결하고, 동일비밀번호이더라도 다른 해쉬결과를 얻을 수 있어 암호를 유추하기 어려워집니다.


salt를 추가하는 방법은 다음과 같이 다양한 방식이 존재합니다. 

비밀번호와 salt를 연접하는 방법은 흔히 사용하므로 다양한 방법을 응용하여 사용하는것이 좋습니다.

- hashing ( salt || password || salt)

- hashing (salt || hashing (password))

- hashing ( password || hashing (password || salt))

- hashing ( hashing (salt) || hashing (password))

- hashing1 (hashing2 (password || salt))




**참고사이트

http://d2.naver.com/helloworld/318732

http://dreamhopp.tistory.com/entry/%EC%95%94%ED%98%B8%ED%99%944

http://www.itworld.co.kr/news/94202

http://ppss.kr/archives/16823


유용한 사이트

http://www.fileformat.info/tool/hash.html

해시 알고리즘으로 변환된 스트링이 제대로 변환되었는지 확인할 수 있는 사이트이다.