====== 베이스64 ( Base64 ) ======
* description : 베이스64 ( Base64 )
* author : 오션
* email : shlim@repia.com
* lastupdate : 2022-05-11 Wed
\\
====== 베이스64 ( Base64 ) ======
===== 1. 적용위치 =====
Apps.repia.com > R-Utils > Crypto - select box - Base64 선택\\
\\
===== 2. 적용 파일 =====
Appsportal > CryptoServiceImpl.java\\
\\
==== 2.1 Base64 적용을 위한 클래스 Import ====
import org.apache.commons.codec.binary.Base64
\\
=== 2.1.1 Ref Link ===
[[https://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/binary/Base64.html|org.apache.commons.codec.binary - Class Base64]]\\
\\
==== 3.1 문제 ====
* A (원본 데이터) : 암호화된 수집 데이터(html파일)
* B (디코딩 결과) : Crypto-Base64로 Decryption(복호화)한 결과
* C (인코딩 결과) : B를 Crypto-Base64로 Encryption(암호화)한 결과
* D (사이트 디코딩 결과) : [[https://www.base64encode.org/|Base64 Decode and Encode]]에서 A를 복호화한 결과
* E (사이트 인코딩 결과) : [[https://www.base64encode.org/|Base64 Decode and Encode]]에서 D를 암호화한 결과
\\
__문제 : html 파일에 대해, A와 E는 동일한 결과값을 표시하지만, C가 다른 결과를 표시__
\\
=== Example ===
''**Crypto-Base64 암호화 결과**''\\
입력값 :
encryptInptFld : <head> // F (입력값이 Crypto 내부에서 변환 & 표시되는 값)
encryptRsltFls : Jmx0O2hlYWQmZ3Q7 // G (F에 Base64가 적용되어 표시되는 결과값)
\\
''**사이트 암호화 결과**''\\
입력값 :
암호화 결과값 : PGhlYWQ+
\\
=== 3.2 해결 방법 ===
=== 3.2.1 기존 코드 ===
else if("base64".equals(cryptoVO.getCryptoMethod())) { // Base64 (binary-to-text encoding schemes)를 선택하고
if(cryptoVO.getEncryptInptFld()!==null) { // encryption(암호화)를 실행하면
byte[] encryptInputByte = cryptoVO.getEncryptInptFld().getBytes("UTF-8"); // encryption 입력값을 charset=UTF-8로 인코딩된 byte 형태로 encryptInputByte에 할당하고
resultData.setEncryptRsltFld(Base64.encodeBase64String(encryptInputByte)); // UTF-8로 인코딩된 encryptInputByte를 Base64 문자열로 반환하여 전달
}
else if(cryptoVO.getDecryptInptFld()!==null) {
String decodeStr = new String(Base64.decodeBase64(cryptoVO.getDecryptInptFld()), "UTF-8"); // 입력된 Base64 문자열을 UTF-8로 디코딩한 값을 String 타입의 decodeStr에 할당
resultData.setDecryptRsltFld(decodeStr);
}
}
\\
=== 3.2.2 1차 수정 코드 ===
else if("base64".equals(cryptoVO.getCryptoMethod())) {
if(cryptoVO.getEncryptInptFld()!==null) {
byte[] encryptInputByte = StringEscapeUtils.unescapeHtml(cryptoVO.getEncryptInptFld()).getBytes("UTF-8");
// 1차 수정코드 - "<"가 "<"로 변경되지 않도록 StringEscapeUtils.unescapeHtml로 처리 후 변환되도록 조치
resultData.setEncryptRsltFld(Base64.encodeBase64String(encryptInputByte));
}
else if(cryptoVO.getDecryptInptFld()!==null) {
String decodeStr = new String(Base64.decodeBase64(cryptoVO.getDecryptInptFld()), "UTF-8");
resultData.setDecryptRsltFld(decodeStr);
}
}
\\
=== 3.2.3 2차 수정 코드 ===
모든 암호화 방식 선택에 대해 미리 cryptoVo.getEncryptInptFld()의 입력값에 대해 인코딩시\\
미리 전처리 실시하도록 하기와 같이 코드를 추가하고, 2.3.1 기존 코드를 유지 \\
\\
...
/* 인코딩시 전처리 실행 '<' -> '<' -> '<' */
if(StringUtils.isNotEmpty(cryptoVO.getEncryptInptFld())){ // 추가된 코드
String unEscapeInputField = StringEscapeUtils.unescapeHtml(cryptoVO.getEncryptInptFld());
cryptoVO.setEncryptInptFld(unEscapeInputField);
log.info("[{}]/[{}]/[{}]", cryptoVO.getEncryptInptFld(), StringEscapeUtils.escapeHtml(cryptoVO.getEncryptInptFld()), StringEscapeUtils.unescapeHtml(cryptoVO.getEncryptInptFld()));
}
...
...
...
else if("base64".equals(cryptoVO.getCryptoMethod())) {
if(cryptoVO.getEncryptInptFld()!==null) {
byte[] encryptInputByte = cryptoVO.getEncryptInptFld().getBytes("UTF-8");
resultData.setEncryptRsltFld(Base64.encodeBase64String(encryptInputByte));
}
else if(cryptoVO.getDecryptInptFld()!==null) {
String decodeStr = new String(Base64.decodeBase64(cryptoVO.getDecryptInptFld()), "UTF-8");
resultData.setDecryptRsltFld(decodeStr);
}
}
\\
{{tag> 오션, base64}}