[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"));