2015년 7월 23일 목요일

javamail smtp 사용 시, 포트 587과 465에 따른 properties 설정

javamail을 사용하여 smtp 메일을 보낼 때에 포트 587과 465에 각각에 따라 properties 설정이 달라야 한다.

포트가 465(TLS)일 때는 다음과 같이 properties를 설정해야 한다.
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "465");

포트가 587(SSL0일 경우엔 다음과 같이 설정해야 한다.
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "587");

위의 내용은 아래 url을 참조하였다.
http://stackoverflow.com/questions/20290625/javamail-javax-mail-authenticationfailedexception

2015년 7월 2일 목요일

OSGi 번들 빌드를 위한 BND 도구

OSGi 위에서 실행되는 번들의 매니페스트 파일을 보면 OSGi 번들이 참조하는 패키지 정보, 포함하고 있는 패키지, export하는 패키지등의 여러 정보가 있다.

이와 같은 정보를 일일이 작성해서 번들을 만들기는 너무가 성가신 일이다. 따라서 이를 자동으로 처리해주는 툴이 있는데 이것이 BND 툴이다.

다음 사이트에서 다운로드 받을 수 있다.

BND 툴로 OSGi 번들을 빌드하거나 3rd party jar 파일들을 OSGi 번들로 변환할 수 있다.

가령 netty-all-4.0.26.Final.jar 파일을 OSGi 번들로 변환할려면 다음과 같이 할 수 있다.

우선 BND 툴을 다운로드 받은 후 cmd 상에서 biz.aQute.bnd-2.3.0.jar 파일이 있는 곳으로 위치한 후에 아래와 같은 명령을 실행하면 된다.

>java -jar biz.aQute.bnd-2.3.0.jar  wrap -o ../netty-all-4.0.26.Final.jar -v 4.0.26.Final -b io.netty netty-all-4.0.26.Final.jar

wrap은 jar 파일을 OSGi로 변환하는 명령이다. -o 옵션은 변환된 파일명을 -v 는 버전, -b 옵션은 번들의 symbolic name을 의미한다.
위와 같이 output 파일명이 기존 파일명과 같을 때에는 변환 실패하게 되므로 디렉토리 위치를 다르게 해줘야 한다.


메이븐 플러그인으로도 BND 툴을 사용할 수 있다. 이는 다음 url을 참조하면 된다.

메이븐 플러그인 사용 시 주의할 점은 리플렉션 코드에서 다른 번들의 클래스를 참조한다면 이를 자동으로 식별할 수가 없게 된다. 이에 따라 번들을 정상적으로 만들어서 배포했는데 어떤 class를 참조할 수가 없다며 에러가 발생하게 된다.

보통 이와 같은 경우는 다음과 같은 jdbc 드라이버를 참조하는 코드를 사용할 때 많이 발생한다. 
Class.forName("com.mysql.jdbc.Driver");

이럴 때에는 Import-Package에 com.mysql.jdbc 를 명시해주어야 한다.
com.mysql.jdbc,*

2015년 6월 30일 화요일

Maven 3rd party jar deploy 방법

netty-all-4.0.26.Final.jar 파일을 레파지토리에 디플로이한다고 해보자.

우선 아래와 같은 dummy pom.xml 파일이 있어야 한다.


















같은 디렉토리에 리눅스라면 다음과 같은 내용이 있는 .sh 파일을 만든다.

mvn deploy:deploy-file -DgroupId=io.netty         \
                       -DartifactId=netty-all   \
                       -Dversion=4.0.26.Final          \
                       -Dfile=~/netty-all-4.0.26.Final.jar        \
                       -Dpackaging=jar              \
                       -DrepositoryId=myrepo   \
                       -Durl=scp://myrepo:2222/

윈도우라면 다음과 같은 내용이 있는 .bat 파일을 만든다.

mvn deploy:deploy-file -DgroupId=io.netty -DartifactId=netty-all -Dversion=4.0.26.Final -Dpackaging=jar -Dfile=C:\netty-all-4.0.26.Final.jar -DrepositoryId=myrepo -Durl=scp://myrepo

그 후, sh 또는 bat 파일을 실행하면 파일이 레파지토리에 디플로이된다.

공인인증서 본인식별 java 코드

다음과 같은 코드를 사용하여 vid 값을 계산한 후 인증서에서 읽어온 vid 값과 비교하여 본인 식별을 할 수 있다.

인자 vid, r, hashType은 인증서에서 읽어온 정보이고 idn은 사용자로 부터 입력받은 값이다.


public static boolean checkVidIntegrity(byte[] vid, String idn, byte[] r, String hashType ) {
            try {
                    DERSequence derSequence = new DERSequence(new ASN1Encodable[] {new DERPrintableString(idn.getBytes()), new DERBitString(r)});

                    byte[] content = derSequence.getDEREncoded();

                    MessageDigest md2 = MessageDigest.getInstance(hashType);
                    md2.update(content);
                    byte[] h2 = md2.digest();
                    md2.reset();
                    md2.update(h2);
                    byte[] vidp2 = md2.digest();

                    System.out.println("frodo core: idn = "+ idn);
                    System.out.println("frodo core: compare vid = " + toHex(vid) + " with vid' = " + toHex(vidp2));

                    return Arrays.equals(vid, vidp2);
            } catch (NoSuchAlgorithmException e) {
                    e.printStackTrace();
                    return false;
            }
}

java hex string <-> byte array 변환

1. hex string -> byte array
byte[] bytes = new java.math.BigInteger(hexText, 16).toByteArray();

2. byte array -> hex string
String hexText = new java.math.BigInteger(bytes).toString(16);

아래처럼 머리 아픈 코드를 안봐도 되니 편하네요. thanks BigInteger! ^^

    public static String toHexString(byte buf[]){
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < buf.length; i++) {
            sb.append(Integer.toHexString(0x0100 + (buf[i] & 0x00FF)).substring(1));
        }
        return sb.toString();
    }

참조: http://ecogeo.tistory.com/129


그러나 BigInteger를 사용하여 hex string을 byte array로 변환시킬 경우, 변환된 byte array의 앞 부분에 값이 0인 바이트가 들어갈 수 있다. 이 점 주의해야 한다.

2015년 6월 24일 수요일

공인인증서의 본인 식별확인 방법 (주민등록번호 또는 사업자 등록 번호를 사용한)

- KISA 문서(1.5-Subscriber Identification Based on Virtual ID.pdf )에서 사용하는 기호의 의미는 다음과 같다.

1) h( ) : 해쉬 함수
2) R : 비트열 난수
3) E( ) : 암호화 함수
4) IDN : 식별번호
5) pk : 전자서명검증키
6) sk : 전자서명생성키
7) VID : 가상식별번호
8) EVID : 암호화된 가상식별번호


- VID 생성방법은 다음과 같다.

VID = h(h(IDN, R))



VID를 검증하기 위해서는 인증서에서 받은 VID 값과  서버에서 위의 식대로 VID' 값을 계산하고 결과가 같은 지를 비교하면 된다.

maven 패스워드 암호화 설정.

아래 url에 메이븐 패스워드 암호화 설정 관련 내용이 있다.

http://maven.apache.org/guides/mini/guide-encryption.html


정리하면 다음과 같다.



maven 2.1.0 부터 지원.

먼저 settings-security.xml을 <settingsSecurity></settingsSecurity>
넣어서 .m2 밑에 만든다.

cmd 창에서 다음 명령행을 실행한다.
  > mvn --encrypt-master-password
그러면 마스터 패스워드가 만들어 진다. 만들어진 패스워드를 settings-security.xml 파일의 settingsSecurity 태그에 넣는다.

그리고 다음 명령을 실행한다.
  > mvn --encrypt-password
그러면 암호화된 패스워드가 만들져 진다.

이를 다음과 같이 정리해 볼 수 있다.



(1) mvn --encrypt-master-password <password>
(2) mvn --encrypt-password <password>


- (유저디렉터리)/.m2/settings-security.xml


<settingsSecurity>
<master>(1)</master>
</settingsSecurity>

- (유저디렉터리)/.m2/settings.xml


<settings>
<servers>
<server>
<id>franken</id>
<username>user</username>
<password>(2)</password>
</server>
</servers>
</settings>

위와 같이 xml 파일을 만들면 됨.