흐르는 시간의 블로그...

난 정말 JAVA를 공부한 적이 없다구요.


첫 테스트 소스 작성 날짜를 보니 8월24일이었다.

참 길게 봤다. 뭐 그간 다른 책을 두권이나 함께 보다보니 길어지긴 했다.

그 사이에 Java로 간단한 프로젝트도 하나 진행하기도 했다.

프로그래밍을 전혀 모르는 사람도 충분히 읽기 좋은 책이다.

저자의 세심함과 노력이 돋보인다.

꼼꼼한 예제와 차분한 설명은 초보자에게 큰 도움이 될것이라 생각한다.

물론 나처럼 아주 오래전 자바를 했다가 최근 다시한번 확인차 보는 사람에게도 물론 도움이 된다.

사실 이 책이전에 보려고 시도 했던 책이 있다.

...

"이펙티브 자바 2판"

...


지금 읽고 있는 웹서버 책과 Go Lang 책을 다 읽고 이펙티브 자바를 진행할지 고민해보자. 

그래도 또 한권을 읽고 정리하고 넘어섰다. ^^

책을 읽고 간단한 프로젝트를 하고나서 자바에 대해 느낀 점은 아래와 같다.

C++ 보다 편하다.

느린점은 분명하다.

하지만 다양한 도구가 큰 도움이 된다.

레퍼런스가 참 많다.

OOP에 대해 어느정도 알면 컴퓨터에 대해 잘 몰라도 쉽게 코딩할 수 있겠다.

이 정도이다.

'' 카테고리의 다른 글

7가지 동시성 모델  (0) 2016.09.22
C++11 STL 프로그래밍  (0) 2015.12.11
Pro Oracle Spatial for Oracle Database 11g  (0) 2011.11.15
오라클SQL튜닝(쿼리의 본질과 성능 튜닝에 대한 37가지 이슈)  (0) 2011.11.15
Head First PMP  (0) 2010.03.06

개인적인 스터디겸 간단한 프로젝트를 Java SE 8으로 개발하였다.

IntelliJ가 많은 도움을 줘서 쉽게 개발하였다.

배포도 귀찮은지라 IntelliJ에서 jar로 만들어 Linux 머신에서 실행하였다.

사용한 것은 JDBC, TCP, Thread, logger와 HashMap, Hashtable, Multimap의 컨테이너들이다.

전반적으로 C++과 큰 차이점은 느끼지 못했다. 헤더와 소스의 분리가 안되는 것과 int 데이터의 적절한 형변환에 더 조심해야하는 것 외에는 말이다.


이렇게 해피엔딩이면 좋았겠지만 PC에서 문제가 없던 부분이 Linux 머신에서는 문제를 일으켰다.

첫번째는 버전 관련 사항이었다.

http://stackoverflow.com/questions/10382929/how-to-fix-java-lang-unsupportedclassversionerror-unsupported-major-minor-versi

뭐 결론은 Linux에 Java SE 8을 인스톨하여 정리하였다.


두번째는 class path 관련 사항이었다.

귀찮아서 jar로 만들어서 실행하였다.


세번째는 JDBC로 연결하는 시간이 매우 많이 소요 됐다.

그래서 스택오버플로에 검색을 했다.

주로 나오는 내용은 random 관련된 사항이었다.


http://stackoverflow.com/questions/5503063/oracle-getconnection-slow

http://stackoverflow.com/questions/137212/how-to-solve-performance-problem-with-java-securerandom


DriverManager.getConnection()에서 SecureRandom을 호출하는데 일반적인 random의 경우 블럭될 수 있다는 것이다. 이 현상은 Linux에서 나타난다 하였다. 해결방법은 urandom을 사용하는 것과 haveged란 프로그램을 통해 random의 seed를 만드는 노이즈를 빨리 수집하는 방법이 있다.

두가지를 모두 적용하였으나 여전히 connection은 5초~30초 사이로 오래 걸렸다.


결국 팀원에게 도움을 청해 답을 얻었다.

네트웍 문제였던 것이다.

IP로 접근하는 지라 특별히 dns문제나 네트웍 쿼리가 문제가 있을꺼라 생각하지 않았으나 내 착각이었다.

/etc/resolv.conf를 수정하여 접근 속도를 개선하였다.

약 400ms이 소요되는지라 아주 빠르다 할 순없지만 말이다.

http://webdir.tistory.com/116




'프로그래밍???' 카테고리의 다른 글

GO Lang 시작  (0) 2016.09.22
iBatis 설정 자료 링크  (0) 2016.01.20
Redis 시작...  (0) 2015.12.11
DNS의 타입에 대해...  (0) 2015.04.21
엑셀에서 랜덤 문자열 생성하는 VBA 스크립트  (0) 2015.03.04

AES 관련 코딩을 하다보니 내가 연결하려는 서버측과 내가 가지고 있는 C++ 소스의 상황이 달랐다.


예제로 구한 코드에서 IV(초기화 벡터)값을 요구 했다.


하지만 고객사에서 보내온 Java 파일에는 해당 값들이 전혀 없었다.(링크된 내용과 동일한 코드였다)


알고 봤더니... 다음과 같은 Block Mode들이 존재 했다.

내쪽에서는 CBC를 사용하는 C++ 코드를 사용했고 상대측에서 보내온 자바파일은 디폴트를 사용했는데 자바는 ECB가 기본이었다


자료 출처는 AES-128-CBC 를 이용하는 방법 을 참고했다

아래의 자료는 위 출처의 자료이다.





AES-128-CBC 를 이용하는 방법

AES는 Block으로 나눠어서 암호화를 하는데 128, 192, 256비트로 나눌 수가 있다.
Block으로 암호화를 할때는 아래와 같이 4가지 모드가 있는데
1. ECB ( Electric Code Book )
2. CBC ( Cipher Block Chaining )
3. OFB ( Output Feed Back )
4. CFB ( Cipher Feed Back )
원래 위의 4개 모드는 DES 이용을 위해 고안되었는데 DES에 한정하지 않고 모든 Block암호에 적용이 가능하다.
이외에도 PCBC와 Counter Method등의 새로운 모드도 고안되고 있다고 한다.
먼저 ECB 모드를 살펴보자.
ECB모드는 1Block씩 단순히 처리를 한다.
암호문공격에 취약하며 사이즈가 큰 문서의 암호는 어울리지 않아 크게 쓰이고 있지는 않은듯하다.

http://jo.centis1504.net/wp-content/uploads/2010/11/Encryption-ECB_MODE.swf

두번째로 CBC모드인데 앞서의 ECB에서의 암호화한 Block의 결과를 다음의 Block에 XOR 연산하여 나가는게 특징이다. 이때 제일 처음의 암호화시에는 마지막 블럭결과를 이용하거나 IV (Initial Vector)를 이용하게 된다.

http://jo.centis1504.net/wp-content/uploads/2010/11/Encryption-CBC_MODE.swf

세번째로 OFB모드인데 IV를 암호화하여 그것을 다시 암호화한 후 계속 난수를 생성한다. 그렇게 생성된 난수리스트를 XOR 연산에 의해 원문에 적용하여 암호화하는 방식이다. 즉, Block암호를 Stream암호와 같이 사용한다고 보면 되겠다.

http://jo.centis1504.net/wp-content/uploads/2010/11/Encryption-OFB_MODE.swf

상세정보는 http://www.triplefalcon.com/Lexicon/Encryption-Block-Mode-1.htm 를 참조할것.
그럼 Java에서 AES-128-CBC를 이용하는 방법은 아래와 같다.
공통키를 생성하는 방법은 이전 포스트를 참조할것.

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secureKey);byte[] iv = cipher.getIV();
byte[] encryptedData = cipher.doFinal("".getBytes());
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE,secureKey);
byte[] iv = cipher.getIV();byte[] encryptedData = cipher.doFinal("".getBytes());

복호화는 아래와 같다.

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
AlgorithmParameters iv = AlgorithmParameters.getInstance("AES");
iv.init("IV".getBytes());
cipher.init(Cipher.DECRYPT_MODE, secureKey, iv);
byte[] plainData = cipher.doFinal(encryptedData);