XE 포럼

이 글은 'MD5'와 'SHA512'를 예로 들어 XE에서 패스워드 등의 암호화(정확히 하면 hash)에 대한 현 상태와 그것을 바꾸기 위해 고려해야 할 사항 등에 대해 정리하였습니다. 어려운 용어는 사용하지 않았으니 전문지식이 없더라도 대강이라도 이해할 수 있는 정도라고 생각합니다. 의문이 있는 부분은 말씀해주시면 추가 설명하겠습니다.


MD5에 대한 옹호하는 뜻도 아니며, SHA512 등 고수준의 알고리즘으로 단순 변경하는 과정을 그려 다양한 고민에 대한 이해가 있었으면 합니다. 감정적으로 바라보지 말아 주시길 바라며, 어디까지나 함께 고민해보자는 취지이지 MD5를 유지하자는 의도가 아님을 밝힙니다.


# 가정

* 서버 보안이 뚫려 웹서버나 DB서버가 노출된 상황을 가정한다

* DB에 해시 된 패스워드 등 회원의 정보가 유출되었다.

* 이 이야기들은 노출된 해시 데이터를 휴리스틱 탐지 등으로부터 보호하기 위한 고민을 논의한다.


# MD5의 취약점

MD5는 그 알고리즘의 특성을 이해하지 않아도 이미 취약할 수 있다는 정보가 돌고 있습니다. 해시 충돌과 해시 사전이 계속 만들어지고 있으므로 상대적으로 안전하지 못할 수 있습니다.


# 그렇다면, MD5를 SHA512로 바꿔보자

해시 함수를 교체하는 것은 아주 간단합니다. 패스워드를 해싱하는 코드를 찾아 MD5($password)를 hash('sha512', $password)로 교체해주기만 하면 됩니다. 치환하는데 1분도 걸리지 않습니다.


## 기존 MD5를 지원해야 하는 호환성 이슈 발생

SHA512로 교체한 버전을 처음 설치하여 사용한다면 문제없지만, 기존 사용하던 데이터를 유지하고 업그레이드하여 적용한 경우 이미 DB에 저장되어 있는 MD5 해시 값에 대한 호환성을 유지해야 합니다. MD5도 SHA512와 마찬가지로 해시 함수이므로 복호화가 불가능합니다. 즉, 로그인시 입력값과 DB에 저장되어 있는 해시값을 비교할 때 SHA512해시값을 비교하고, 맞지 않으면 MD5로 해시하여 비교해야합니다. 실제로 XE에서는 mysql의 PASSWORD함수로 해시된 값을 이러한 방식으로 지원하고 있습니다(zb4에 대한 호환성 지원).


## DB컬럼 사이즈를 늘려야 합니다

현재 XE에서는 패스워드의 해시값을 저장해두는 컬럼은 최대 60자의 문자열을 저장할 수 있습니다. MD5의 32자와 mysql PASSWORD의 16자 또는 41자를 저장하는데는 무리가 없습니다. SHA512는 128자의 문자열을 만들어내기에 해당 컬럼 사이즈를 늘려야합니다. 이는 XE에서 모듈 업데이트 기능을 통해 구현 가능하나, sqlite 구버전 일부와 cubrid에서는 컬럼사이즈 변경이 불가합니다.

이를 위해 해당 컬럼사이즈를 늘린 테이블을 복제하여 데이터를 옮기거나 기존 테이블에 두 개의 패스워드 컬럼을 유지해야합니다. 테이블을 복제하는 경우 업데이트 진행도중 PHP timeout에 걸려 업데이트에 장애가 발생하게되면 동작에 문제가 있을 것으로 쉽게 예측됩니다. 또 한 번의 혼란이 생기는거죠.


새로 설치한다고 가정한다면 고민하지 않아도 될 문제입니다. 하지만, 이미 많은 사용자가 있으므로 업데이트 호환성을 유지해야만합니다.


# SHA512 적용. 데이터가 유출되었다는 가정

SHA512로 해싱된 패스워드는 안전해보입니다. SHA512도 해시 사전이 만들어지고 있지만, MD5에 비해 비교적 안전합니다.

처음 가정에서  DB서버 및 웹서버가 해킹에 노출되거나 DB데이터가 유출된 상황을 설정했기 때문에, SHA512로 해싱된 패스워드를 포함해 회원데이터가 유출되었다고 상황을 설정하겠습니다.


# 휴리스틱 탐지 & 해시사전

## 기초 동작방법

휴리스틱 탐지 방법의 가장 단순한 형태는 1부터 1씩 증가시켜 같은 해시 값을 찾을 때까지 반복합니다.

제가 예로 들었던 코드도 숫자형태의 패스워드를 1씩 증가시켜 같은 해시 값을 찾아내는 코드입니다.

<?php
$password = hash('sha512', '1234');
$loop_var = '1';
while($pw = hash('sha512', $loop_var)) {
if($password == $pw) {
echo '요잉네 : '.$loop_var;
exit;
}
$loop_var++;
}
?>

위 코드는 아래와 같이 동작합니다.

  1. $password 변수에 '1234'라는 패스워드를 해싱한 값을 담아 둠. 즉 SHA512로 해싱된 'd404559f602ea... 생략'라는 값을 가지게 됨
  2. $loop_var 변수에 1을 담고
  3. while문 안에서 $loop_var의 값을 SHA512로 해싱하여 그 결과가 $password와 동일한지 검사
  4. 동일하면 $loop_var에 담아 둔 숫자를 출력하고 종료
  5. 4에서 해시 값이 동일하지 않으면 $loop_var을 1 증가시키고 3과 4의 과정을 반복

아주 단순 무식한 형태입니다.

## MD5의 32자와 SHA512의 128자

해시결과 문자열의 길이는 휴리스틱 탐지에 차이를 줄 수 없습니다. 반복 데이터의 대상이 '8282, abc123'과 같은 평문을 순차적으로 증가시키며 해시값을 만들어 기존 해시값과 비교합니다. 'c4ca4238a0b923820dcc509a6f75849b'이러한 해시 결과를 증가시켜 비교하는 것이 아니므로, 32자에서 128자로 늘어 경우의 수가 기하급수적으로 늘었다고 생각할 수 있으나 휴리스틱 탐지에 영향을 주지 못합니다. 패스워드가 10자리라고 가정했을때 10자리의 문자열을 증가하는 것이 빠르지 32자나 128자를 가지고 루프 돌리는 바보는 없을테니까요.

또 잘 생각해보면… 32자의 '00000000000000000000000000000000'부터 'zzzzzzzz…생략'까지 증가시켜 'c4ca4238a0b923820dcc509a6f75849b'를 찾았다한들 복호화가 불가능하므로 원문을 찾을 수 없습니다. 그저 'c4ca4238a0b923820dcc509a6f75849b'까지 루프를 돌고 끝냈을 뿐입니다. 뻘짓이죠.


## 그래도 SHA512가 푸는데 오래걸리지 않나?

직접 비교해보지는 못했지만, MD5보다 SHA512의 연산이 좀 더 느릴거라 예상합니다. 1회 해싱하는데에는 체감되지 않겠으나 수 십만, 수 백만 번 반복된다면 큰 차이를 예상할 수 있겠죠. 이것은 '고수준'의 알고리즘보다는 '좀 더 느린'알고리즘이라는 차이에서 발생합니다. 하지만, 컴퓨팅 환경은 더욱 좋아지고 연산 속도도 빨라지고있습니다. 휴리스틱 탐지에 대해 과연 SHA512가 강력한가에 대한 의문이 들 수 밖에 없습니다.


## 탐지툴의 단어사전

휴리스틱 탐지툴은 1씩 증가시키는 아주 단순한 툴도 많지만, 좀 더 지능화되어 사전에 등재된 주요 단어 데이터를 내장하고 있습니다. 'rabbit486'처럼 사전에 등재된 'rabbit'과 숫자를 조합하면 순차적으로 증가시키는 방법보다 좀 더 빠르게 찾아낼 수도 있습니다. 또한 이메일이나 이름, 생년월일, ID 등을 참조하는 방식의 구현도 가능합니다.


## 해시사전

SHA512보다 MD5의 해시사전의 데이터 누적양은 방대합니다. 하지만, 이것은 SHA512보다 MD5가 휴리스틱 탐지를 통해 원문을 찾아 낼 확률을 더 높이지는 않습니다. SHA512도 해시사전이 만들어지고 있으므로 수 년 후에는 SHA512의 안전성도 보장하기 어려울 수 있습니다.


# 휴리스틱 탐지에 대응하기

## 유일한 해결책

휴리스틱 탐지에 대응하는 방법은 딱 한 가지 뿐입니다. '느리게'하는 것입니다. 10만 회원정보를 하나씩 돌려가며 단순한 조합의 패스워드는 10여분 이내 또는 몇 초만에 원문을 찾아낼 수 있습니다.

'느리게'하는 방법으로는 '느린'알고리즘을 사용하여 해시하거나 패스워드를 어렵게 조합하는 것입니다.


## 패스워드 조합

많은 사이트에서 괜히 패스워드에 특수문자를 섞도록 강요하는게 아닙니다. 앞에서 설명한 휴리스틱 탐지에 대해 이해하셨다면 아래와 같이 간단하게 휴리스틱 탐지에 걸리지 않는 방법을 생각해 낼 수 있습니다.

  • 길게
  • 숫자, 영문, 특수문자를 섞어서
  • 생년월일이나 ID를 포함하지 않도록


사이트마다 다르지만 패스워드를 설정할 때 다음과 같은 제약을하고 있습니다.

  • 8자리 이상
  • 영문과 숫자 조합
  • 영문과 숫자, 특수문자 조합
  • ID를 포함하지 않을 것
  • 이메일 주소와 유사하지 않을 것
  • 숫자가 123과 같이 증가형이지 않을 것
  • 444나 8282처럼 반복적이지 않을 것


흔히 도어락에 8282와 같이 반복되거나 무심코 시도해 볼 법한 조합이나 생년월일을 사용하지 말라는 것과 마찬가지입니다.


# 단순한 패스워드에 대한 대책

일반적으로 패스워드를 위와 같이 복잡하게 설정해야한다면 이를 알지 못하는 일반 회원들의 불만이 날아옵니다. 가능하면 위와 같이 패스워드를 어렵게 설정하라고 강요했으면 좋겠지만 저연령 및 고연령자를 고려하여 짧은 패스워드를 허용해야할 수도 있습니다. 여전히 회원들은 'rabbit486'과 같은 사전에 등재된 단어나 어렵지않게 유추할 수 있는 조합을 사용할 수도 있습니다.


## 임의의 문자열 더하기

'사전에 등재되지 않고, 반복적이지 않으며…'를 바탕으로 임의의 문자열을 입력받은 패스워드 앞뒤에 붙여 해싱하면 패스워드 길이를 증가시키기 때문에 휴리스틱 탐지에 대응하기 좋습니다. 임의 문자열은 'JVJsoieFEgOsF*TJ%F^8E^&WG'처럼 불규칙하게 마구 입력한 형태이면 좋겠죠. 혹자는 'ID+패스워드, 패스워드+패스워드' 이런 조합을 생각할 수 있으나 코드가 공개되어 있으므로 DB가 유출되었다면 의미 없는 방법입니다.


하지만, 우리는 해킹되어 데이터가 노출된 상황을 가정하고 있으며 그렇지 않다하더라도 코드가 공개되어 있는 소프트웨어이기 때문에 어떤 문자열을 추가하고 있는지 쉽게 알 수 있습니다. 휴리스틱 탐지시 'JVJsoieFEgOsF*TJ%F^8E^&WG'를 붙여 돌리면 탐지방법에 차이가 전혀 없습니다.


이를 해결하기위해 임의의 문자열을 배포되는 코드가 아닌 XE설치시 관리자로부터 입력받거나 랜덤으로 생성하여 사용하면 됩니다. 하지만 이 역시도 해킹된 상황에서는 해당 문자열도 쉽게 노출되므로 이전과 같은 상황이 됩니다. 이 문자열을 일반적인 호스팅에서도 안전하게 보관하도록 설정하기란 어렵습니다. 다양한 환경에서 적용 가능한 방법이 제시되어야합니다.


# 정리

## SHA512도 마찬가지

MD5보다는 낫다고 볼 수 있으나, 휴리스틱 탐지 방법에 이해하셨다면 SHA512도 MD5와 마찬가지로 휴리스틱 탐지에 동일하게 노출된다는 것을 알 수 있습니다.


## 그래도 MD5가 더 취약하지 않느냐

동의하나, 단순히 MD5를 SHA512로 교체하는 것으로는 해결책이 될 수 없습니다. 1~2년 후에는 SHA512를 대상으로 이러한 논란이 또 벌어질 수 있습니다.


## 고민해야 할 것

  • 기존에 저장된 MD5값에 대한 하위 호환성
  • SHA512가 적용된 버전을 사용하다가 MD5가 적용된 하위 버전으로 되돌아가는 상황에 대한 대책
    • 기존버전에서 SHA512를 지원하도록 패치가 필요하겠죠
    • 이는 모든 버전에 대한 파일을 배포할 수 없으므로, 관리자가 직접 패치해야합니다
  • DB 컬럼 사이즈 조정이 필요하므로 그에 대한 대책
    • sqlite 구버전과 큐브리드에 대한 문제
    • 대량 데이터
  • SHA512 해시사전이 만들어지고 있는 만큼 또 다시 변경이 필요한 상황
    • SHA512지원패치를 했었다면 또 새로운 방식에 대한 호환성을 위해 관리자들이 패치를 해야합니다
    • 이러한 상황이 반복되지 않도록 여러 고민을 거쳐 신중히 결정되어야합니다
  • 패스워드에 더하는 '임의의 문자열'을 안전하게 보관하는 방법
    • 일반적인 호스팅에서도 적용 가능한 방법이어야합니다
    • 특정 호스팅 환경에서 문제가 되는 방법은 쓸 수 없습니다
    • 특수한 권한을 가진 처리가 필요한 방법은 쓸 수 없습니다

# 최우선 과제

지금까지 '해킹'이 되었다는 가정하에서 살펴봤습니다. 해시값이 노출되었을 때의 상황이며, MD5던 SHA512던 해시된 값이 쉽게 노출되지 않도록 방지하고 해킹에 대비하는 것이 우선입니다.

## 웹/DB/파일 서버 등의 계정 패스워드 관리 중요

흔히 일반 웹호스팅을 이용하는 경우에 일반 사이트에 설정해서 사용하는 패스워드를 그대로 사용합니다. 서버 엑세스 계정은 특수한 권한을 가지므로 각 계정 마다 패스워드를 다르게 설정하고 되도록 복잡한 조합을 사용하도록합니다. 또한 해당 계정으로 접속하는 PC에 키로거 등의 키 입력을 가로채거나 패킷을 가로채는 툴이 설치되지 않도록 보안프로그램을 사용해야합니다.

## 관리페이지 접속 계정 - admin

설치시 입력한 admin패스워드도 일반 사이트에 가입했던 패스워드와 다르게 설정할 필요가 있습니다. 웹관리 권한의 획득이라 서버관리 권한을 획득한 것과는 비교적 덜 위험할 수 있으나 중요 정보를 획득할 수있는 통로를 제공합니다.

## XE에서의 방지책

이전 토론에서 나왔던 것처럼 웹페이지의 로그인을 통해 무한정 대입이 가능한 부분을 막아야합니다. 이를 처리하기 위해서도 다양한 고민이 필요합니다. 이 외에도 보완해야 할 부분이 있는지 살펴봐야겠죠.



# 가장 중요한 것

함께 방법을 생각해보자는 것입니다. 오픈소스의 철학을 개발주체에게만 강요되고 있는 것같아 많이 아쉽습니다. 오픈소스의 철학을 이야기하며 사용자들의 요구 수용을 해야하는 것이 아니냐며 꾸짖거나 '철학'따위 없는 소프트웨어라 비난합니다. 그런 분들은 '요구만'하시고는 방법에 대한 고민이나 함께 하려는 노력은 보여주지 않습니다. 오픈소스의 철학은 개발주체에게만 강요되며 그 것을 말하고 있는 당사자는 그저 요구에서 그칩니다. 물론, 모두가 개발자가 아니기에 직접적인 참여는 불가능합니다. 하지만, 요구 수용이 안되었을 때 그 이유를 듣고 이해하려는 노력이 아닌 일방적인 요구 수용을 강요하려는 모습에서는 여러분이 말하는 오픈소스의 철학 따위는 찾아볼 수 없습니다.


'왜 안하는지 이해할 수 없다'라는 것으로 화만내지마시고 상대가 무엇을 말하고 있는지에 대해 이해하려 해주셨으면 합니다. 설명이 부족하다면 추가 설명을 요청해주세요. 어떤 부분에서 이해가 되지 않는지 어떠한 이유 때문에 안되는 것인지, 도대체 무엇 때문에 어려운 것인지 조목조목 짚어주시면 그에 대한 대답이 가능합니다. 서로 이해할 수 있는 방법을 찾아야지 상대가 거만한 자세로 나온다는 생각으로 감정적으로 대응하시면 도저히 이야기를 진행할 수 없습니다.


어떠한 토론이던 감정적으로 대응하면 더 이상 진행이 되지않습니다. 감정 싸움으로 번지고 어느쪽이 '이겼다'라는 성취감을 맛 보고 끝나버립니다. 아무것도 해결되지 않은채 말이죠.

태그 연관 글
  1. [2014/04/21] Blog 제주대학교 오픈소스 수업 참여 by XE *2
  2. [2013/08/14] XE 포럼 XE의 향후, 내 생각 by 라르게덴 (1) *8
  3. [2012/04/19] XE 포럼 XE Core 차기버전에 비밀번호 암호화 방식을 선택적으로 변경할 수 있습니다. by BNU *23
  4. [2012/01/30] XE 사용팁 활용 예로 살펴보는 XE 라이선스 by BNU
  5. [2012/01/10] XE 포럼 내가 생각하는 오픈소스 by 라르게덴 *7
글쓴이 제목 최종 글
가을풍경 공지 대구 지역 XE 개발자모임을 만들면 좋겟습니다. [11] 2014.07.29 by rjfnaksnx
銀童 공지 XE 개발자들의 모임을 해볼까 합니다. [35] 2014.07.29 by rjfnaksnx
BNU 공지 XE 이슈 등록은 Github 프로젝트를 이용해주세요. [13] 2014.07.29 by rjfnaksnx
궁금궁금궁금이 1.5 업데이트 이후 텍스타일 소셜 XE 어떠신가요? [5] 2012.04.02 by 궁금궁금궁금이
니오티 XE 시퀸스에 대한 문제점 토론  
궁금궁금궁금이 관리자 페이지를 볼 수 없을때 업데이트와 캐쉬파일 재생성을 할 수 있는 방법?? [3] 2012.04.01 by 윈컴이
BNU 휴리스틱 탐지 방법을 살펴보고 고민해야 할 것 [13] 2012.04.01 by BNU
Garamhwi 아이패드는 무엇으로 인식합니까 [6] 2012.04.01 by 궁금궁금궁금이
친환경엔진 본인이 작성한 글에 본인 댓글을 삭제하면 포인트가 감점됩니다.(1.5.2.1 사용중) [1] 2012.04.01 by 윈컴이
콜롬보(유승용) 암호화 및 해독에 관하여 [79] 2012.03.31 by BNU
초보케이 모바일모드 컬러셋 적용관련 문의입니다. [4] file 2012.03.31 by 초보케이
정찬명 p, br 옵션과 에디터 선택 가능성에 대한 생각. [12] 2012.03.31 by 푸하라
착한악마 마스터 db와 슬레이브 db는 어떨때 사용 되는 것일까요? [5] 2012.03.30 by 착한악마
늘푸른83 이슈 올린지 10일이군요.. [12] 2012.03.30 by 늘푸른83
때린데 또때려 xe 공홈 버그 하나 추가 합니다. 계단현상 [8] file 2012.03.30 by 때린데 또때려
mekey 잘 사용하고 있습니다! XE 이하 여러 프로그램들.. [1] 2012.03.30 by 정찬명
한마음^^ DB 커넥션의 급격한 증가로 인한 홈피 다운의 원인이 XE의 문제인가요?? [4] 2012.03.30 by 한마음^^
카이닉스 혹시 페이지 이동시 간혈적으로 백지화면 나오시는분 없으십니까? [4] 2012.03.30 by 카이닉스
가람아이 우리나라 블로거들의 현실... [20] file 2012.03.30 by 가람아이
코뿔소2020 XE가 꼭 넘어야 할 큰 장벽 [1] 2012.03.30 by 코뿔소2020
도라미 에디터...코어안에 내장시키겠다는건지..... [1] 2012.03.30 by hhgyu
madab 도와 주세요 [2] 2012.03.29 by madab
본체 1.5.2 버전인데 faq스킨을 사용하면 검색창이 이상합니다. [2] file 2012.03.29 by SOLID.H