뭘 이런걸..

Posted
Filed under Tech/프로그래밍
LePuTTY의 ZMODEM 기능을 iPuTTY에 포팅을 했습니다.

일단, 동작은 잘 하는 것 같네요. 좀 더 사용해 보고 문제가 없으면 0.69.1 로 릴리즈 할 예정 입니다. 그전에 PuTTY 0.70이 나오면 0.70으로 릴리즈 될 것이고요 :-)

https://github.com/iPuTTY/iPuTTY/pull/25

참고 하세요.
2017/06/12 03:40 2017/06/12 03:40
Posted
Filed under Tech/프로그래밍
어쩌다 보니 iPuTTY maintaing을 하게 되었습니다. 기존 관리자였던 김준기님이 작년에 project를 더이상 하지 않겠다고 project site에 공지를 올렸고, 비공식적으로 PuTTY 업데이트를 반영해서 사용하다가 그냥 제가 맡아서 하기로 하였습니다.

어쩌다 보니, 뒷처리 담당자로서 우뚝선 느낌입니다. :-)

어쨌든 4/29에 릴리즈된 PuTTY 0.69의 대응 버전을 릴리즈 했으며, 추가적으로 기능을 좀 더 강화 했습니다. 솔직히 GUI programing이 처음이고 PuTTY 코드를 제대로 본 것도 아니라서 잘 유지할 수 있을지 모르겠지만, 나서는 사람이 없어 일단 제가 총대를 매게 되었습니다. (아쉬운 사람이 해야 하는 관계로 T.T)

project 사이트는 bitbucket에서 GitHub로 이전을 했으며, https://github.com/iPuTTY/iPuTTY/wiki 를 이용하면 되겠습니다.

0.69 에서 제공하는 기능은 다음과 같습니다.

  • 한글 UI 제공
    • 다시 한글 UI를 제공 하며, pagent, puttygen, pscp, psftp 등 모든 프로그램에서 한글 UI를 제공 합니다.
  • 이제 64bit binary를 제공 합니다.
  • psftp 와 pscp 에서 UTF-8을 사용할 수 있습니다.
  • 한글 입력 모드에서 Esc를 누르면 자동으로 영문 입력 모드로 변경이 됩니다.
  • 서버 호스트키 체크 여부 옵션이 추가 되었습니다.
  • Cygterm backend 가 추가 되었습니다.
  • psftp 에서 ls 명령으로 개별 file 목록을 볼 수 없는 버그를 수정했습니다.

자세한 사항은 https://github.com/iPuTTY/iPuTTY/wiki 를 참고 하세요.
2017/05/17 01:34 2017/05/17 01:34
Posted
Filed under Tech/프로그래밍
요즘 IT 업계에서 보안이 화두이기는 한 것 같습니다. 지인에게서 ISMS 인증이 빡세어 졌다는 등의 소식도 있고..

근래 free lancer로 일을 하면서 진행하는 project에서도 역시 보안이 화두인가 봅니다. project 마무리를 하고 있는 상황에서, 갑자기 설정 파일을 암호화를 해 달라는 요청을 받았습니다. 그것도 다른 파일들은 나두고 설정 파일만..

대충 복호화가 가능한 알고리즘을 이용해서 eval로 실행을 시킬까 고민을 잠시 하기는 했었는데, 영 eval 은 아닌 것 같고 검색을 해 보니 php_screw 라는 것이 보이더군요. 그래서 이 놈을 사용하려고 code를 좀 살펴 보았는데, 좀 걸리는 부분들이 많더군요.

  1. php_unscrew로 복호화가 가능하다.
  2. decode api (zencode.c) 에서 전역 변수를 사용하여 thread safe 하지 못하다. (프로젝트와는 상관이 없지만...)
  3. 복호시에 temp file을 생성한다.
  4. decode 시에 memory realloc을 너무 자주 한다. 사이즈가 큰 암호화 파일의 경우 성능을 떨어뜨릴 수 있다.
  5. 파일 몇 개를 암호화 하기 위해서, 모든 파일의 magic key 체크를 한다.

등등.. 복호화 문제와 성능의 문제가 고민이 되었습니다.

성능의 문제의 경우, 처음 php_screw를 살펴 보던 시점에서는 opcode cache를 고려하지 않았고 또한 테스트를 해 보지 않은지라 성능상의 문제가 좀 커 보였었던 점이 있습니다. 지금 시점에서 말하자면, opcacheAPC와 같은 PHP code cache 프로그램을 이용하면, magic key 체크, decode 등의 이슈는 상당히 많이 줄어들게 됩니다.

다만, 하고 있는 프로젝트가 순간 폭주가 가능한 서비스인지라, cache time이 짧을 경우 문제가 될 소지가 있었고, 또한 php_uncrew에 의한 복호화의 문제도 있어 어쩔수 없이 코드를 건드리게 되었고, mod_screwim (PHP Screw Improved)라는 fork 버전을 릴리즈 했습니다.

대략적인 개선 사항은, 다음과 같습니다.

  1. temp flie을 생성하는 방식에서 신성욱님의 개선사항을 반영하여 PHP memstream을 이용한 방식으로 개선
    1. 개선 사항에 있던 memory leak 수정
    2. 반환값이 없을 경우 segfault 발생하는 문제 수정
    3. 파일을 2번 open 하는 버그 수정
  2. 전역 변수를 없애 thread safe하도록 수정
  3. memory reallocation 로직을 수정하여 사이즈가 큰 암호화된 파일을 decode 시에 성능 개선
  4. 암호화 SEED key 자동 random 생성
  5. screwim.enable ini 옵션이 enable 상태에서만 decodeing을 한다. (ini_set 이용 가능하며, magic key 검사 이슈)
  6. runtime encrypt/decrypt API 제공 (screwim_encrypt(), screwim_decrypt(), screwim_seed())
  7. php_unscrew 방식의 복호화를 어렵게 수정

뭐, 그 외에도 자잘한 것들이 있기는 하지만 그리 중요한 것 같지는 않고, 자세한 사항은 https://github.com/OOPS-ORG-PHP/mod_screwim/ 을 참고 하시기 바랍니다.

그리고, 이 모듈(mod_screwim)을 사용하려면 (또는 php_screw를 사용하려면) 꼭 (opcache 또는 APC 같은..) cache를 같이 사용해야 decode 시의 성능 손실을 최소화 할 수 있습니다.
2016/11/30 01:36 2016/11/30 01:36
Posted
Filed under Tech/프로그래밍
VIM 에서 PHP를 작성할 때, indent 기능을 사용할 경우 switch가 아래와 같이 정렬이 됩니다. 

<?php 
switch ($a) {
case '1' :
echo "1\n";
break;
default :
echo "12\n";
}
?>


즉, case 문의 depth가 switch와 동일하게 되는 현상인데, 이걸 싫어 하는 사람도 많습니다. 그래서 case를 indent 시키고 싶다면 .vimrc 에 다음의 설정을 추가해 주세요.

let g:PHP_vintage_case_default_indent = 1


그리고 다시 indent 시켜 보면 다음과 같이 정렬이 됩니다.

<?php
switch ($a) {
case '1' :
echo "1\n";
break;
default :
echo "2\n";
}
?>


2016/07/08 17:50 2016/07/08 17:50
Posted
Filed under Tech/프로그래밍
안녕 리눅스 3의 PHP 버전을 7로 올려서 release 하려고 하다보니.. 별 개삽질을 다하고 있다.
일단, PHP wiki에서 https://wiki.php.net/phpng-upgrading 를 참고하여 작업을 하면 되는데, 문제는 여기에 나와있지 않은 경우가 너무나 많다.

결국에는 PHP 소스 코드를 뒤져서 구현해야 하는.. 더군다나 여기에 나와있지 않은 hole들도 굉장히 많다. 대표적으로..

char * input;
int ilen;
int no;
 
if ( zend_parse_parameters (ZEND_NUM_ARGS(), "sl", &input, &ilen, &no) == FAILURE )
    RETURN_FALSE;
이 코드는 컴파일을 잘 되나, 그냥 segfault 가 발생한다. s(String)과 l(integer)는 다음과 같이 해 줘야 한다.

zend_string * Zinput = NULL;
zend_long no;

char * input;
int ilen;

if ( zend_parse_parameters (ZEND_NUM_ARGS(), "Sl", &input, &no) == FAILURE )
    RETURN_FALSE;

input = ZSTR_VAL (input);
ilen = ZSTR_LEN (input);
zend_parse_parameters 에서 string은 zend_string으로 변경해 줘야 하고, long은 zend_long로 선언을 변경해 줘야 한다. 이 외에도, string을 zval 변수로 변환하는 경우도 짜증난 케이스

zval *zv;
MAKE_STD_ZVAL (zv)
ZVAL_STRING (zv, "문자열");
이 코드는 다음과 같이 변경 되어야 한다.
zval zv;
ZVAL_STRING (&zv, "문자열");
,,,
zval_ptr_dtor (&zv);
이 외에도 너무 많아서 정리가 힘들다. PHP7은 잘못하면 python 3 꼴이 날지도 모르겠다. 3party module 중에서 PHP 7을 지원을 얼마나 빨리 해 주ㄴ냐가 관건인 듯.. 물론 php code 호환 문제 까지는 바라보기도 전에 말이다. (갈 길이 너무 멀다....) 내가 만든 3party 확장들은 PHP 7 지원을 위한 코드 변경이 너무 많아서, 아예 PHP 7 지원하는 버전은 하위 호환성을 포기하고 컴파일을 막아 버렸다. --;
#if PHP_API_VERSION < 20151012
#error "************ PHP version dependency problems *******************"
#error "This package requires over php 7.0.0 !!"
#error "If you build with php under 7.0.0, use mod_krisp 2.x version"
#error "You can download mod_krisp 2.x at http://mirror.oops.org/pub/oops/libkrisp/APIs/php/"
#endif
참고로.. mod_korean migraion diff 를 보면.. 얼마나 많이 변경을 해야 하는지 대충 감이 올 듯.. 이 링크는 아직도 작업이 완료되지 않은 상태이다. --;
2015/12/29 05:15 2015/12/29 05:15
김정균

ncurses extension 작업 완료

ncurses: https://bugs.php.net/bug.php?id=71299

김정균

하.. 숨어있는 문제들이 훨씬 더 많군요 :-(

내부 구조의 많은 변경으로, 단순하게 API 변경만 따라가다가는 엉뚱한 문제들이 송송 터지네요. 예를 들면 https://github.com/expressif/pecl-event-libevent/issues/3 요런 문제들이..

PHP 7의 걸림돌은 3rd party extension 들이겠군요.

참고로 PHP 7을 지원하도록 수정된(거의 비공식적인) 3rd party extension 목록을 공유합니다.

memcache: https://github.com/websupport-sk/pecl-memcache/tree/php7
libevent: https://github.com/expressif/pecl-event-libevent/
event: https://bitbucket.org/osmanov/pecl-event/src/7f233a23b34bb100753971766c5ea2611fe8d023/?at=php7-dev
mongodb: http://pecl.php.net/package/mongodb/1.1.1

등등..

Posted
Filed under Tech/프로그래밍
어쩌다 보니 시간이 남아돌게 되었고 (안녕 리눅스 3을 기다리시는 분들께는 안녕 리눅스 3작업을 못해서 죄송합니다. 작업 환경이 없어져서 못하는 관계로 이해해 주십시오.. )

중기님의 iPutty 0.64 release 계획은 보이지도 않고..

그래서 iPutty 0.63에 Putty 0.64 변경 사항을 반영하여 64bit로 빌드한 binary를 공유 합니다. 기존 버전과 추가 기능도 있습니다.

Changelog:
  1. 0.64 변경 사항 반영
    https://bitbucket.org/daybreaker/iputty/issue/11/putty-064
  2. 64bit build
    https://bitbucket.org/daybreaker/iputty/issue/12/64bit
  3. cygterm 지원 (puttycyg 패치 적용)
    https://bitbucket.org/daybreaker/iputty/issue/10/puttycyg
  4. psftp의 ls가 디렉토리 리스팅만 가능한 것을 "ls file"도 가능하도록 수정
  5. psftp utf8 지원 (remote는 기본으로 utf8임)
    https://bitbucket.org/daybreaker/iputty/issue/13/psftp-utf8

2015/05/30 00:20 2015/05/30 00:20
Posted
Filed under Tech/프로그래밍
요즘 문중 홈페이지를 새로 만드는 작업을 하고 있고, 여기에 회원 인증을 OAuth로 구성을 하고 있습니다. 대충 구글/페이스북/트위터/다음/네이트를 지원하고 있는데, Naver의 경우에는 Naver OAuth가 회원 정보를 주지 않아서 구현만 하고 사용은 하지 않고 있었습니다.

그런데 얼마전, 네이버에서 "네이버 아이디로 로그인"이라는 API를 새로 런칭 하였고, 이 API는 OAuth2 기반으로 구현을 하였더군요. (Naver OAuth는 OAuth10a로 구현되어 있습니다.)

사이트 설명에서는 mobile만 library를 지원하고 PC에서는 그냥 설명만 있어서, 그래도 네이버인데 누군가 만들지 않을까 하고선 한두달을 기다렸는데 나오지를 않더군요.

아무래도 OAuth로 회원 인증을 하려다 보니, 우리나라에서 가장 많은 사용자를 가진 네이버를 무시할 수 없고, 또한 문중 어르신들에게 네이버 외에 아이디가 없으면 다른 곳에 가입을 하라고 권유를 드리기가 너무 힘들어서 결국에는 구현을 해 보았습니다.

일단 설치는 pear 저장소를 통해서 배포를 하므로, 아래와 같이 할 수 있습니다. 자세한 사항은 OOPS Pear repository 홈페이지를 참고 하세요.

[root@main ~] pear channel-discover pear.oops.org
Adding Channel "pear.oops.org" succeeded
Discovery of channel "pear.oops.org" succeeded
[root@main ~] pear install oops/NAVER


그러면 간단한 사용법을 적어 보겠습니다.

일단 "네이버 아이디로 로그인" API를 사용하려면 OAuth2 ClientID와 ClientSecret key를 발급 받아야 합니다. 다른 곳과는 다르게 네이버는 심사를 하더군요. 최대 3일 이내에 처리를 해 주기는 합니다만, 경쟁상대인 다음도 심사를 하지는 않는데 좀 그렇더군요. 그리고 사용 조건도 상당히 까다로운 편입니다. 네이버 BI를 지켜야 하는 등 ..

일단 발급을 받았다면 다음의 코드와 같이 작성할 수 있습니다. 굉장히 심플 합니다. ^^;
블러그에 코드가 별로 이쁘게 나오지를 않으니 가독성을 위해서는 다음 문서들을 참고 하세요

NAVER OAuth2 pear package Reference
NAVER OAuth pear package 예제 코드

<?php
/* $Id: test.php 1 2014-05-16 19:11:07Z oops $ */

require_once 'NAVER.php';

session_start ();

// 에러 발생시에 catch를 하기 위하여 error handler를 등록
set_error_handler ('myException::myErrorHandler');

try {
    // 발급받은 키를 등록한다.
    $login = (object) array (
        'id'       => '8avBegO24BpmziA3027D',
        'secret'   => '1zUVPMAl5R',
        'callback' => 'http://domain.com/path/this/file'
    );

    // 인증 과정을 수행
    $naver = new NAVER ($login);

    // 인증 과정 완료 후 사용자 정보를 가져옴
    $user = $naver->getUser ();

    // 유저 정보 출력
    print_r ($user);

} catch ( myException $e ) {
    // 에러 발생시에 다음 출력
    echo '<pre>' . PHP_EOL;
    echo $e->Message () . PHP_EOL;
    print_r ($e->TraceAsArray ());
    exit;
}

/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * End:
 * vim600: noet sw=4 ts=4 fdm=marker
 * vim<600: noet sw=4 ts=4
 */
?>

2014/05/17 05:35 2014/05/17 05:35
Posted
Filed under Tech/프로그래밍
얼마전 망법/개인정보 보호법 개정 시행령 때문에 한동안 AES 암호화에 대해서 작업을 했는데..

MySQL의 AES_ENCRYPT는 AES-128까지 밖에 지원이 되지 않습니다. 256bit를 지원하기 위해서는 소스의 AES_KEY_LENGTH 상수를 256으로 수정하여 다시 빌드를 하라는 문서 밖에 찾을 수가 없었습니다. MySQL을 다시 빌드하라는 것은 너무 끔찍하고, 누군가 UDF를 만들어 놓지 않았을까 생각을 하고선 열심히 찾아 보았으나, 대부분 application에서 처리를 하는지 찾을 수가 없네요.

그래서, application에서 처리를 하다보니 어쩌다가 MySQL UDF까지 만들고 말아 버렸습니다.

일단, MySQL에서 UDF로 AES-256을 지원을 하고, php와 javascript에서 이 함수들과 호환이 되는 API를 만드는 것이 1차 목표였는데요.

작업 결과, AES-128, AES-192, AES-256을 지원가능하게 만들었고, AES-128시에는 MySQL의 native AES_ENCRYPT/AES_DECRYPT와 호환이 되게 작성이 되었습니다. MySQL의 AES_KEY_LENGTH 상수값을 256으로 변경을 하여 리빌드를 하면, 키길이가 128bit라도 AES-256으로 Encryption되지만, 제가 만든 MySQL UDF는 key bit에 따라 AES-128, AES-192, AES-256으로 Encryption이 됩니다.

소스는 여기서 다운로드 받을 수 있습니다.

https://github.com/Joungkyun/lib_mysqludf_aes256
http://mirror.oops.org/pub/oops/php/pear/mysqlAES/
http://mirror.oops.org/pub/oops/javascript/mysqlAES/

잘 사용하기를..

혹시 문의가 있으면, http://oops.org/의 QnA Board로 하기 바랍니다. 여기에 질문하면 한 두세달 뒤에 확인할 확률이 높습니다. :-)
2013/09/23 02:56 2013/09/23 02:56
권기진

좋은글 감사합니다.
mysql 5.5 에서 AES-256을 구현해야 해서 찾다가 정균님의 글을 발견하게 되었습니다.
개발해 주신 노고에 감사드립니다.

김정균

mysql의 경우 5.6.17 부터 block_encryption_mode 옵션을 이용하여 AES_ENCRYTP를 AES-256으로 동작 시킬 수 있습니다. 다음 URL 참고 하세요.

http://mysqlblog.fivefarmers.com/2014/03/27/mysql-5-6-17-now-with-better-encryption/

mysql 5.7.4 부터는 key 길이를 32byte로 지정하면 AES-256으로 암호화 가능 합니다.

김정균

mariadb 10.1 에서 1.0.3 정상 동작 확인 되었습니다.

Posted
Filed under Tech/프로그래밍
16 x 10000 짜리 1px 세로 점선을 그리다가 포기하고 gd를 구현해서 만들어 보았다.

역시 매뉴얼 다 뒤져서 고생한지라 잊어버리지 않도록 기록한다.

<?php
# 이미지 길이
$he = 11400;

/*
 * 16 x 11400 의 이미지를 생성. gif의 경우 파일 생성이 이상하게
 * 되며, png의 경우 브라우저가 인식을 못한다.
 */
$im    = imagecreatetruecolor(16, $he);
$gray  = imagecolorallocate($im, 128, 128, 128);
$black = imagecolorallocate($im, 0, 0, 0);

# background를 투명 처리한다.
imagecolortransparent($im, $black);

for ($i=1; $i<$he; $i+=2 ) {
    printf ("%d - %d\n", $i, $i + 1);
    imagesetpixel ($im, 7, $i, $gray);
}

imagegif($im, './dashedline.gif');
imagedestroy($im);
?>
2013/03/08 02:44 2013/03/08 02:44
Posted
Filed under Tech/프로그래밍
요즘 슬슬 CVS를 SVN으로 옮겨 보려고 하고 있다. 괜찮은 svn interface가 뭐가 있난 찾다 보니 websvn이라는 놈이 깔끔하고 괜찮아 보였다. 다른 web interface들은 기존에 사용하던 cvsweb의 기능 중 지원하지 못하는 것들이 많아 좀 불편해 보였는데, 이 놈은 기존 사용하던 기능을 대부분 지원 하는 듯 하다.

그런데, 내가 주로 많이 사용하던 기능 중 diff시에 raw text를 출력해 주는 unified diff가 없다는 것이 꽤 답답했다. 웹에서 확인을 하고 mouse로 확 긁어서 붙이는 행위를 가끔 하는데, 이 놈이 이게 없는 것이다. 뭐 그래서 만들었다.

필요한 사람은 잘 사용하시도록.. (국내에서도 websvn 꽤 사용하는 듯..)

이 글을 올리는 이유는 patch를 제출하려고 했더니.. 첨부 파일이 없어서.. --;

Websvn Unified diff patch file

2011/04/14 21:26 2011/04/14 21:26