<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> <%@ page import="java.lang.reflect.Method" %> <%@ page import="org.apache.commons.lang3.StringUtils" %> <%@ page import="com.eactive.eai.rms.common.login.SessionManager" %> <%! // 최소 HTML 이스케이프 (진단 페이지 XSS 방지) private String esc(String s) { if (s == null) return ""; StringBuilder b = new StringBuilder(s.length() + 16); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); switch (c) { case '&': b.append("&"); break; case '<': b.append("<"); break; case '>': b.append(">"); break; case '"': b.append("""); break; case '\'': b.append("'"); break; default: b.append(c); } } return b.toString(); } %> <% // 로그인 사용자만 접근 — real 모드에서 운영 키 암복호화 오라클이 되지 않도록 보호 if (StringUtils.isBlank(SessionManager.getUserId(request)) && StringUtils.isBlank(SessionManager.getRoleIdString(request))) { response.sendRedirect(request.getContextPath() + "/loginForm.do"); return; } response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Expires", "0"); request.setCharacterEncoding("utf-8"); String op = request.getParameter("op"); String input = request.getParameter("input"); boolean run = request.getParameter("run") != null; if (op == null) op = "encrypt"; if (input == null) input = ""; String mode = "UNKNOWN"; String revision = "-"; String returnCode = "-"; String result = ""; String error = ""; boolean loaded = false; try { Class cls = Class.forName("com.eactive.ext.djb.DamoManager"); Object damo = cls.getMethod("getInstance").invoke(null); loaded = true; boolean bypass = (Boolean) cls.getMethod("isBypassMode").invoke(damo); boolean fake = (Boolean) cls.getMethod("isFakeMode").invoke(damo); mode = bypass ? "BYPASS" : (fake ? "FAKE" : "REAL"); revision = String.valueOf(cls.getMethod("getRevision").invoke(damo)); returnCode = String.valueOf(cls.getMethod("getReturnCode").invoke(damo)); if (run) { if ("encrypt".equals(op)) { result = (String) cls.getMethod("encrypt", String.class).invoke(damo, input); } else if ("decrypt".equals(op)) { result = (String) cls.getMethod("decrypt", String.class).invoke(damo, input); } else if ("sha256".equals(op)) { int t = cls.getField("SHA256").getInt(null); result = (String) cls.getMethod("hash", int.class, String.class).invoke(damo, t, input); } else if ("sha512".equals(op)) { int t = cls.getField("SHA512").getInt(null); result = (String) cls.getMethod("hash", int.class, String.class).invoke(damo, t, input); } else { error = "알 수 없는 op: " + op; } } } catch (ClassNotFoundException e) { error = "com.eactive.ext.djb.DamoManager 클래스를 찾을 수 없습니다. " + "damo-manager.jar 를 WAS lib (운영) 또는 WEB-INF/lib 에 배포하세요."; } catch (Throwable t) { // require-real fail-fast(ExceptionInInitializerError) 또는 초기화 실패(NoClassDefFoundError) 포함 Throwable c = (t.getCause() != null) ? t.getCause() : t; error = c.toString(); if (c instanceof NoClassDefFoundError || error.contains("require-real") || error.contains("Could not initialize")) { error += " (※ -Ddamo-manager.require-real=true 인데 scpdb 가 없어 기동에 실패했을 수 있습니다. " + "scpdb 를 갖추거나 옵션을 내리세요.)"; } } String badgeColor = "REAL".equals(mode) ? "#1a7f37" : "BYPASS".equals(mode) ? "#9a3412" : "FAKE".equals(mode) ? "#9a6700" : "#6e7781"; %> DamoManager 테스트

DamoManager 테스트

웹에서 encrypt / decrypt / hash 동작을 즉시 확인 (eapim-admin)
<% if (loaded) { %> <%= mode %> MODE revision=<%= esc(revision) %> · returnCode=<%= esc(returnCode) %> <% } else { %> NOT LOADED damo-manager.jar 미배포 <% } %>
<% if (run || error.length() > 0) { %>
"><%= error.length() > 0 ? esc(error) : esc(result) %>
<% } %>
모드 의미 — BYPASS: 무변환 원문 통과(기본값, 옵션 없음) · FAKE: Base64/JRE 해시(-Ddamo-manager.enabled=true, scpdb 없음) · REAL: penta scpdb 실 암복호화(enabled=true + scpdb).
BYPASS 모드에서는 encrypt/decrypt/hash 모두 입력을 그대로 반환합니다.
운영은 -Ddamo-manager.require-real=true 로 real 강제(아니면 기동 실패). CLI 로도 동일 확인: java -jar damo-manager.jar enc <text>