Archive for February, 2005

정태영

예전에 웹메일은 만들다가 중단했던 가장 큰 이유 중 하나는 imap_open 을 사용하기 위해서는 아이디와 비밀번호가 필요하다는 점이었다. 세션을 유지시키려면 아이디와 비밀번호를 저장하고 있었어야 했는데 이 부분을 도대체 어떻게 안전하게 처리할 지 생각해낼 수가 없었다.

(mbox 방식이라면, 그냥 mbox 파일을 imap_open 으로 여는 꽁수가 있다.)

흠 다시 만들 생각을 하고.. 오픈소스 웹메일인 SquirrelMail 은 사용자의 암호와 비밀번호를 어떻게 저장하고 있나를 살펴봤는데 1.4.3a 버젼의 암호 저장 방식은 너무나도 황당했다. -_-;;

SquirrelMail 에선 비밀번호의 길이와 똑같은 길이의 OneTimePad 라는 이름의 salt 를 만들어내고, (비밀번호 길이만큼 srand 로 0~255 사이의 값을 얻어서..) salt 와 비밀번호를 xor 한 다음에 base64 를 해서 저장을 해두는데... 문제는 그 salt 와.. 암호화된 비밀번호를 둘 다 session 에 저장시켜 놓는 다는 점이다.

안전하기 위해선 세션이 가로채기를 당해도 문제가 없도록, xor 된 암호와 salt 를 분산 시켜서 저장해놓았어야 한다고 생각한다. (1.4.4 에서는 salt 는 cookie 에 저장시키기 때문에 이전 방식보다 안전하다고 생각한다.)

뭐 하튼 나도 저런 식으로 비밀번호를 암호화 하고, salt 와 암호화된 비밀번호를 세션과 쿠키에 나눠서 넣는 식으로 관리하면 될 것 같다. 다만 squirrelmail 에서 사용하는 방식은 암호의 길이를 유추해내는게 가능하기 때문에, 암호가 짧아질 경우 안전을 보장하기 힘들어지는 문제점이 있을 수 있어보인다.

C:
  1. #define SALT_LEN 32
  2.  
  3. char alphabet[] = "abcdefghijklmnopqrstuvwxyzABCDEFG....~!@#$%^*()_+-=[]{}\|'\";:/?.>,<";
  4. int alphabet_size = strlen(alphabet);
  5.  
  6. int salt[SALT_LEN];
  7.  
  8. len = strlen(pass);
  9. for( i = 0 ; i <len ; i++ ){
  10.     salt[i] = alphabet[rand()%alphabet_size];
  11. }
  12.  
  13. for( ; i <SALT ; i++ ){
  14.     char r1, r2;
  15.     r1 = alphabet[rand()%alphabet_size];
  16.     r2 = alphabet[rand()%alphabet_size];
  17.  
  18.     salt[i] = r1 ^ r2;
  19. }

password 는 키보드로 입력할 수 있는 값이니까 0~9, a~z, A~Z 그리고 특수문자들로만 구성될 것이므로 위의 pseudo code 에서처럼 salt 를 만들어낼 때 password 길이 까지는 0~9, a~z, A~Z 와 특수문자 중에서 랜덤하게 뽑아내고, password 의 길이를 넘어서는 입력 가능한 값 (compiler 용어론 alphabet) 두 개를 xor 해서 나올 수 있는 값으로 뽑아내는 방식도 괜찮을 거 같다.

정태영

금요일날 돌아와서 봐요..

정태영

스팸같은 경우야 오판해서 필터링되지 말아야할 메일까지 필터링될까봐 놔두고 있지만, 바이러스 필터정도는 적용시켜보면 어떨까 싶어서 자료를 찾아보는 중 clamav 라는 GPL 바이러스 스캐너를 찾아냈습니다.

바이러스 메일을 스캔하기 위해선 clamd 를 이용해서 daemon 상태로 smtp 포트 감시를 하거나 clamassasin 을 통해 procmail 에서 처리하면 되겠더군요.

또한 cron 에 freshclam 을 등록해놓을 경우 간단하게 바이러스 데이타베이스를 최신 버젼으로 유지시킬 수 있습니다. 평들도 나쁘지 않은 듯 하니 postfix 에 procmail 을 붙이고 clamassassin 로 바이러스 메일을 필터링해봐야 겠네요.

정태영

gd-2.0.29 버젼 이후로는.. 폰트를 찾는데 fontconfig 를 사용할 수 있다.. fontconfig 를 사용할 수 있게 되면.. gdImageFTString 같은 함수에서.. font 의 FULL PATH 를 적어주는 대신.. unfonts 식으로 쓸 수 있기 때문에 상당히 편리해진다.. 사용하는 방법은.. 뭐 간단하게.. gdFTUseFontConfig(1) 을 한 번 호출해주기만 하면 되는데.. php의 기본 gd 모듈에는.. 저 함수가 없다.. 그래서 간단하게.. 저 함수를 추가해줘 봤는데.. 그다지 어렵지는 않은 듯..

config.m4 를 수정.. gdFTUseFontConfig 함수가 있으면.. HAVE_GD_FT_USE_FONTCONFIG 를 define 하도록 수정하고.. php_gd.h 에.. gdftusefontconfig 를 선언해주고 (그냥 c에서 프로토타입 선언하는거랑은 조금 다르더군) gd.c 마지막쯤에.. gdftusefontconfig 함수를 만들어 넣었다..

다 고친담에.. php 소스의 루트에서.. ./buildconf --force 한 방 때려준 담에 php 를 빌드하면 깔끔하게 성공 꺄르르

패치파일은 php_gdftusefontconfig.diff 여기에 :)

http://bugs.php.net 에 지르기는 했는데.. 뭔가 젠투 버그질라랑은 느낌이 사뭇 다르다 -_-;;
http://bugs.php.net/bug.php?id=31784