From e4851999bab6ec910fde65ff6f8a5a7ae378b22d Mon Sep 17 00:00:00 2001 From: curry772 Date: Fri, 19 Jun 2026 17:58:03 +0900 Subject: [PATCH] =?UTF-8?q?HSM=20key=20=EA=B0=80=EC=A0=B8=EC=98=A4?= =?UTF-8?q?=EB=8A=94=20=ED=95=84=ED=84=B0=20=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dynamic/filter/HSMKeyCryptoFilter.java | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 src/main/java/com/eactive/eai/custom/adapter/http/dynamic/filter/HSMKeyCryptoFilter.java diff --git a/src/main/java/com/eactive/eai/custom/adapter/http/dynamic/filter/HSMKeyCryptoFilter.java b/src/main/java/com/eactive/eai/custom/adapter/http/dynamic/filter/HSMKeyCryptoFilter.java new file mode 100644 index 0000000..8e53203 --- /dev/null +++ b/src/main/java/com/eactive/eai/custom/adapter/http/dynamic/filter/HSMKeyCryptoFilter.java @@ -0,0 +1,76 @@ +package com.eactive.eai.custom.adapter.http.dynamic.filter; + +import java.security.KeyStore; +import java.util.Base64; +import java.util.Properties; + +import javax.crypto.SecretKey; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.json.simple.JSONObject; +import org.springframework.http.HttpStatus; + +import com.eactive.eai.adapter.http.dynamic.filter.FilterException; +import com.eactive.eai.adapter.http.dynamic.filter.HttpAdapterFilter; +import com.eactive.eai.common.hsm.HsmManager; +import com.eactive.eai.common.util.Logger; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; + +public class HSMKeyCryptoFilter implements HttpAdapterFilter { + + private static final Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER); + + private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + + @Override + public Object doPreFilter(String adptGrpName, String adptName, Object message, Properties prop, + HttpServletRequest request, HttpServletResponse response) throws Exception { + try { + ObjectNode rootNode = null; + String jsonStr = null; + if (message instanceof String) { + jsonStr = (String) message; + } else if (message instanceof JSONObject) { + jsonStr = ((JSONObject) message).toJSONString(); + } else { + return message; + } + rootNode = (ObjectNode)OBJECT_MAPPER.readTree(jsonStr); + + JsonNode hsmKeyAlias = rootNode.get("hsmKeyAlias"); + if (hsmKeyAlias != null) { + String hsmKeyAliasValue = hsmKeyAlias.textValue(); + KeyStore keyStore = HsmManager.getInstance().getKeyStore(); + + java.security.Key key = keyStore.getKey(hsmKeyAliasValue, null); + if (key instanceof SecretKey) { + SecretKey secretKey = (SecretKey) key; + byte[] encoded = secretKey.getEncoded(); + if (encoded != null) { + String encBase64 = Base64.getEncoder().encodeToString(encoded); + logger.debug("HsmManager] HSM - {} : [{}]", hsmKeyAliasValue, encBase64); + rootNode.put("hsmKeyBase64", encBase64); + rootNode.put("hsmKeyRaw", new String(encoded)); + } else { + logger.debug("HsmManager] HSM - secretKey null {} : [{}]", hsmKeyAliasValue, secretKey); + } + } + } + String jsonString = OBJECT_MAPPER.writeValueAsString(rootNode); + return jsonString; + + } catch (Exception e) { + throw new FilterException("HSM key 가져오기 실패", ERROR_PRE_FAIL, HttpStatus.INTERNAL_SERVER_ERROR.value(), e); + } + } + + @Override + public Object doPostFilter(String adptGrpName, String adptName, Object resultMessage, Properties prop, + HttpServletRequest request, HttpServletResponse response) throws Exception { + return resultMessage; + } + +}