====== 베이스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}}