Rath World » 2005 » January

Archive

Archive for January, 2005

OpenSSL – JCE Service Provider

January 26th, 2005 5 comments

전혀 새로운 기술은 아니지만, 살짝 구글링 해봐도 안나오길래.. 만들기로 결심했다.
그것은 바로 JCA(Java Cryptography Architecture) service provider 형태로 openssl 을 쓰면 좋겠다는 생각!
사실 openssl의 libssl 과 libcrypto 중, libcrypto 를 지원하는 provider라고 말하는 것이 옳다.

이름은 빠밤~ OpenSSL-Java 이다. sourceforge 에 프로젝트로 걸어놓은 상태다. 이녀석이 하는 역할은 뭔고하니 자바에서 JCA 인터페이스를 그대로 지키면서 구현부를 openssl로 스위칭 할 수 있게 하자는 모토이다.

구성은 아래처럼 된다.

Any Java Application with crypto
—————-
Java Cryptography Architecture
—————-
OpenSSL-Java (JCA Provider 형태)
—————–
Java Native Interface
—————–
OpenSSL wrapper (JNI 형태)
—————–
OpenSSL

검정색 – Crypto 프로그래머가 만드는 부분
파랑색 – Sun Microsystems가 구현한 인터페이스
갈색 – 내가 만든 부분 (괜히 패키지명에 내 닉 안넣고 org.openssl 로 했음)
초록색 – openssl

OpenSSL-Java 의 최대 강점은 J2SE로 순수하게 프로그래밍 해놓은 어플리케이션을 단 한줄도 바꾸지 않고 openssl 구현부로 switch 해버릴 수 있다는 것이다. 이 모든 것은 JCA의 힘!

JCA 나 JCE가 생소한 분들을 위해 JCA 를 사용하여 프로그래밍한 자바 코드의 예를 보자.

import java.security.MessageDigest;

MessageDigest md = MessageDigest.getInstance(“MD5”);
MessageDigest sha = MessageDigest.getInstance(“SHA1”);
md.update( “에헤헤”.getBytes(“UTF-8”) );
sha.update( “우히히”.getBytes(“UTF-8”) );
byte[] ret_md = md.digest();
byte[] ret_sha = sha.digest();

이것이 JCA 를 사용하는 자바 코드이다. 여기의 md5, sha1 부분을 openssl로 쓰고 싶을땐

1. JRE의 설정을 변경할 수 있을 때 (기존 코드 수정 불필요)

$JAVA_HOME/jre/lib/security/java.security 파일을 열어서
security.provider.1 에 org.openssl.java.OpenSSL 로 바꾸고 저장.

2. JRE의 설정을 변경할 수 없을 때 (기존 코드 1줄 수정)

main 클래스에서 아래와 같은 한 줄을 추가해준 후,
Security.addProvider(new org.openssl.java.OpenSSL())
instance를 만들때 MessageDigest.getInstance(“MD5”, “OpenSSL”) 이렇게 얻어온다.

아무래도 2번 방식은 코드를 고치는 귀찮음이 따를테니 (어차피 한줄이지만 -_-) 가능하면 jre/lib/security/java.security 파일을 편집하는것이 더 나을 것이다.

이것을 실제로 사용하기 위해서 필요한 파일이 2개이다.

openssl-jce.jar – 열심히 만든 openssl JCE Provider.
libopenssl-java.so – 열심히 만든 JNI openssl wrap 파일

openssl-jce.jar는 classpath에 넣어주고, libopenssl-java.so 이면 LD_LIBRARY_PATH에 걸어주고 (linux), openssl-java.dll은 PATH에 놓아준다(Windows). jvm 실행시 -Djava.library.path 로 잡아줘도 된다.

——————————————————-
내 데스크탑의 경우 모든 Java application에 추가 설정없이 OpenSSL-Java를 이용하기 위해 아래와 같이 구성해놓았다.

1. openssl-jce.jar 를 jre/lib/ext 에 위치
2. libopenssl-java.so 를 /usr/lib 에 위치시킨 후, LD_LIBRARY_PATH에 넣음 (linux)
3. jre/lib/security/java.security 파일의 provider.1 을 org.openssl.java.OpenSSL 로 대치.

위처럼 해놓으면 servlet container 이건 https 건 ssl 이건 몽땅 OpenSSL-Java로 돌릴 수 있다! 왜냐하면 SSL Handshake 중에도 SHA1, DES 등을 많이 사용하기 때문에 분명 이점이 있기 때문이다.
잊은것이 있다. OpenSSL-Java 가 지원예정인 알고리즘의 목록을 말해주지 않았다.

MD4, MD5, SHA1, SHA, DES, Blowfish, RC2, RC4, RC5, HMAC-MD5, HMAC-SHA1

ecb, cbc 도 왠만하면 다 구현할 예정이다.
현재 구현된 것은 MD4, MD5, SHA, SHA1, HMAC-MD5, HMAC-SHA1 이고, 실제로 OpenSSL-Java를 만드는데 필요한 지식은 아래와 같다.

1. JCA Service Provider 구조 이해 및 구현 방법
2. 각 알고리즘을 자바로 사용하는 방법
3. 각 알고리즘을 openssl을 이용하여 c 코드로 작성하는 방법
4. JNI 구현 방법

아직 sourceforge 에는 코드를 1인치도 안올려놨다. 프로젝트에 c 코드가 있고 사용자 시스템의 openssl과 연동되는 부분이기 때문에, autotools로 깔끔하게 만들어서 안쪽팔린 상태로 올리고 싶기 때문이다 -_-;
openssl-jce 의 jni header와 class 파일들은 ant 로 쉽게 작성해두었지만, jni 코드들을 컴파일하게 하려면.. 내 꿈은

ant
./configure –with-openssl=/path/to/openssl –with-java=/path/to/java
make

이런식으로 사용자가 3줄로 컴파일 및 설치를 끝내게 했으면.. 하기 때문!
요새 바빠서 autotools 를 공부해서 적용해놓으려면 꽤나 시간이 걸릴듯 싶다 ㅡ_ㅡ

Categories: Development Tags:

Jython auto completion 구현하다

January 17th, 2005 2 comments

Jython interpreter에 tab auto-completion 기능 구현! 및 gnu-readline 연동

[서문]
20시간동안 쉬지않고 Telnet(RFC854, RFC855, RFC857, RFC858, RFC859)을 구현하고 ANSI와 싸우다보니 어제 블로그를 남긴 이후로 컴퓨터 앞에 그대로 앉아있다. 자기위해 따스한 물로 샤워를 하니 몸과 마음이 개운해지는것 같다. 그러다보니… 지난 12월 21일에 작업한 Jython auto-completor 내용을 아무데도 업데이트 안했다는 사실을 알았다!

그렇다.. 사실 나 지난달 12월 22일에 데스크탑 하드날렸다 ㅡㅡ;
충격이 이만저만이 아니여서.. 머리속이 또 리셋되었던 것이다.

[본론]
각설하고… 지난 12월 21일경, 열심히 IRC를 하고 있던중 때마침 gnu-readline을 자바에서도 쓸 수 없을까.. 하는 얘기가 돌고 있었다. 오호라.. 그래 jni로 wrap해서 꿀꺽해버릴까~ 했었는데 우리의 신 Google 님께서 gnu-readline을 wrap 해놓은 java-readline 의 존재를 가르켜주셨다. (Linux, Solaris를 지원하고 Windows는 지원하지 않음!)

요새는 검색만 해도 필요한게 다 나와있는 세상이 맞았다. (java telnet 쪽은 안그렇더만 -_-)
그리하여 “그럼 이제 java-readline을 jython에 적용만 시키면 되겠지” 하고 생각하려던 순간, java-readline 홈페이지의 “Projects using Java-Readline”을 보았더니.. 헉 “Jython” 이 떡하니 적혀있는 것이다.
후다닥 Jython 코드내에서 Readline 쓰는 부분을 찾는도중 nohmad 님이 jython registry 파일안에

python.console=org.python.util.ReadlineConsole
python.console.readlinelib=GnuReadline

만 적어주면 적용된다는걸 찾아내셨다.
좋다.. 테스트 해보니, 인터프리터에서 그냥 엔터치면 null error가 나오는 버그가 있긴했지만, 즐거운 방향키로 이전 입력한것 찾기 같은것도 잘 되었다!

근데.. auto completion이 안된다.
분명히 java-readline은 org.gnu.readline.ReadlineCompleter 라는 클래스를 제공하고 있는데!!! Jython 에서는 그게 안되는 것이다.

[결론]
삽질이 시작되었고 jython에 적합하도록 auto completor를 구현하고 기존 버그수정 및 테스트하는데 성공하였다. 결국 짠!

rath@gentoo rath $ jython
Jython 2.1 on java1.4.2_06 (JIT: null)
Type “copyright”, “credits” or “license” for more information.
>>> import sys
>>> sys.s
font-style: italic;”>sys.setClassLoader sys.settrace sys.stdin
sys.setprofile sys.stderr sys.stdout
>>> sys.set
font-style: italic;”>sys.setClassLoader sys.setprofile sys.settrace
>>> sys.set

유후~

[사용법]
1. jython 을 받아 설치한다.
2. java-readline 을 받아 설치한다.
3. 내 Projects 메뉴에서 jython-completion.jar 을 받는다.
4. jython의 registry 파일을 열어 마지막 부분에 다음과 같이 입력한다
python.console=rath.ExtendedReadlineConsole
python.console.readlinelib=GnuReadline
5. jython을 실행시키는 shell script 파일을 연다.
– libreadline.so 파일이 있는 위치를 -Djava.library.path=/usr/lib 형식으로 추가한다.
– libreadline-java.jar 파일을 classpath 에 추가한다.
– jython-completion.jar 파일을 classpath 에 추가한다.
6. 저장하고 jython 실행!

import sys 를 입력한 뒤,
sys. 까지만 입력하고 TAB을 강하게 눌러보잣!

Categories: Development Tags:

타자방의 부활을 꿈꾸며

January 16th, 2005 5 comments

IRC를 즐기다가 문득 ‘한컴타자연습’에 대해서 들었다. 이게 얼마만에 듣는 단어인가 -ㅠ-
문득 타자연습 프로그램을 사용하고 싶었지만, 데스크탑은 gentoo 이고 노트북과 vmware에는
한컴오피스가 설치되어있지 않다.

신도와의 대화중 문득 생각이 나버렸다. 나우누리 타자방의 기억..

지금도 타자방 시절의 사람들과 ‘가장’ 친하다. 통신친구의 특징중에 하나인 얼굴을 자주 볼 수 없다. — 라는 문제점을 빼면 언제나 좋은 기억만 남아있는 그룹이다.
실제로 안만났기때문에 나쁜 기억이 발생할 기회를 얻지 못했을 가능성도 농후하지만 –;
그러나 대부분 타자방에서 좋았던 사람은 실제로 만났을때도 느낌이 좋았다.

현재까지 친밀하게 지내는 사람은 나우누리 타자파 킹파 사람 몇몇과 ETC 그룹이다.
여기서 ETC는 ‘기타 등등’을 뜻하는 것이 아니라 English Typing Club 의 이니셜이다.
그 당시 클럽 가입조건은 영문 평타 400타 이상이였던것 같다.
멤버로는 내 홈페이지 링크의 상위를 메우고 있는 사람들 + 알파이다.
(그러고보니 그러네 -ㅅ-)

sediah(aides), 신도(www11www), 중원(seahouse), 부리(poweroot), 조아(푸른놀), 듀스(akh2000) 이다.

다행히 나우누리 타자방의 딸기를 개발하신 sediah님이 ETC 멤버이기때문에 -ㅅ- 타자방을 텔넷 기반 BBS에 붙이는 것은 어렵지 않을거라 생각된다.

그럼 이제 나우누리와 같은 텔넷 기반 BBS가 있어야 하는데..
내 전공은 자바이고 어떤 프로그램을 만들때 개인적으로 C로 하는 것 보다는 자바로 개발하는 것이 20배는 빠르다고 확신할 수 있기때문에 –; 텔넷 bbs를 자바로 만들어야 한다.

RFC 854, 855 등을 열심히 읽고 ethreal 질을 통해서 DO, DONT, WILL, WONT 와 몇가지 옵션을 지원하는 텔넷 I/O 클래스 개발은 성공했고, 이제 간단한 ANSI 코드를 공부중이다.

아히히 졸라 재밌다. 얏호~

Categories: Development Tags: