본문 바로가기

James Server v3/SMTP

[Base64] ENAGE 잘못된 Encoding 예.

ㅁ 지금까지 발생한 Base64 문제는 2가지 경우인데 미원상사에서 발생한 문제는 조금 다른 시각으로 봐야 한다.


 -  case #1 : multi line decoding 을 java lib 들이 지원하지 않음

 -  case #2 : multi line decoding 에 서로 다른 charset 

 -  case #3 : ENAGX 라는 그룹웨어 메일로 발송한 메일인데 base64 를 Spec 에 맞지 않게 발송하였음.


ㅁ 문제

    Subject: =?ks_c_5601-1987?B?.........................MPisO3F68E=?=
                  =?ks_c_5601-1987?B?.........................68DHILDHLCAg?=

   (......................... 은 혹시라도 디코딩 해볼까바 치환하였음)

  

    (https://ko.wikipedia.org/wiki/%EB%B2%A0%EC%9D%B4%EC%8A%A464)


    마지막  68E=?= 를 보면 ?= padding 앞에 "=" 로 끝난다. 즉 저 한줄에서 decoding 이 가능해야 한다.

   

    하지만 결과는 "고객에게 제품 MSDS 발송 및 수취확인에 따른 출고통�� 프로그램 개발완료 및 적용의 건, " 과 같이

    인코딩이 깨져서 보인다.


    뭔 Base64 가지고 암호해독하는 것도 아니고...

   

ㅁ 원인

   제목이 아래(#0) 와 같다면

       #0 "가나다라마바사아자차카타파하,  "

       #1. "가나다라마바사"

       #2. "아자차카타파하,  "

         1)   #0 / 2

         2)  #1 -> byte[] -> base64

         3)  #2 -> byte[] -> base64

   로 적용을 해야하는데 ENAGE 메일은

         1)  #0 -> byte[] / 2

         2) base64[0] , base64[1] 와 같이 적용한다.

   

   결국 저 encoding은 기존의 궤를 다르게 한다.


ㅁ 대안

    case #3 은 case #1,case #2 와 논리적으로 호환 될 수 없다.

 

    header 에 X-Mailer: G-Mail(ENAGE Inc.) 가 포함되어 있으니

    위 header case 에 대하여 아래와 같이 조치한다.


ㅁ 해결

  이해하기 쉽도록 unit test 로 간단하게 예제를 만들었으며 MultiLineDecoderUtil 에서 지원할 것이다. 


  String s1 = "........................./.........................F68E=";
  String s2 = "........................./Pt+........................./68DHILDHLCAg";
  
  byte[] b1 = Base64.decodeBase64(s1);
  byte[] b2 = Base64.decodeBase64(s2);
  

// case 1,2
  System.out.println(new String(b1, "MS949") + new String(b2, "MS949"));
  
//case 3  
  ByteArrayBuffer bb = new ByteArrayBuffer(b1.length + b2.length);
  bb.append(b1, 0, b1.length);
  bb.append(b2, 0, b2.length);
  System.out.println(new String(bb.toByteArray(), "MS949"));