Skip to content

KMS Decrypt (CALS-SDK)

1. 시나리오

  • CALS-Studio > Utility > Key Management에서 AlgorithmKMS-AES이고, Manage TypeExternal 또는 Application로 설정한 경우 해당 복호화 Key 정보를 조회하는 로직 작성

2. 인터페이스 정의

  • Request Parameter
요소 명하위 요소 명데이터 타입요구 수준설명
applicationIdStringRequired복호화 Key 정보를 가져올 ApplicationSYS_ID
accountIdStringRequired복호화 Key 정보를 가져올 AccountSYS_ID
userIdStringRequired복호화 Key 정보를 가져올 사용자의 SYS_ID
arrDecryptItemArray[Object]Required복호화 Key 정보를 가져오기 위한 배열 객체
keyIdStringRequiredApplication/External DBqt_key_master 테이블에서 복호화 Key 정보를 가져올 RowSYS_ID
encDataKeyStringRequiredApplication/External DBqt_key_master 테이블에서 복호화 Key 정보를 가져올 RowENC_DATA_KEY
encDataStringRequiredApplication/External DBqt_key_master 테이블에서 복호화 Key 정보를 가져올 RowENC_DATA
  • Response Parameter
요소 명하위 요소 명2차 하위 요소명데이터 타입설명
successBooleanAPI 요청 성공 실패 여부 [true / false]
errorObjectError 정보 객체
codeInteger에러 코드
typeString에러 타입
messageString에러 메세지
payloadObject응답 객체
itemsArray[Object]복호화된 데이터 배열 객체
decryptKeyString복호화 Key
keyIdStringApplication/External DBqt_key_master 테이블에서 복호화 Key 정보를 가져올 RowSYS_ID
encDataStringApplication/External DBqt_key_master 테이블에서 복호화 Key 정보를 가져올 RowENC_DATA
encDataKeyStringApplication/External DBqt_key_master 테이블에서 복호화 Key 정보를 가져올 RowENC_DATA_KEY

3. 소스 작성 예시

  • src/controller.js
async process () {
 calsLogger.param(this.event, this.context)

 // 1. 요청 파라미터 Application ID 유효성 체크
 if (CompareUtility.isEmpty(this.objRequestParams.applicationId)) {
   throw new ParameterNonExistException('applicationId')
 }

 // 2. 요청 파라미터 Account ID 유효성 체크
 if (CompareUtility.isEmpty(this.objRequestParams.accountId)) {
   throw new ParameterNonExistException('accountId')
 }

 // 3. 요청 파라미터 User ID 유효성 체크
 if (CompareUtility.isEmpty(this.objRequestParams.userId)) {
   throw new ParameterNonExistException('userId')
 }

 this.objReturn = await this.clsService.runMethod({ objRequestParams: this.objRequestParams, objReturn: this.objReturn })

 calsLogger.result(this.objReturn)
 return this.objReturn
}
  • src/service.js
'use strict'

const { BaseService, calsLogger, CompareUtility, OperationFailException } = require('@cals-framework/lambda')
const DAO = require('./dao')
const calsSdk = new (require('cals-sdk')).CalsSDK()

module.exports = class Service extends BaseService {
 constructor () {
   super()

   this.calsContext.daoContext === undefined
   ? this.clsDAO = new DAO()
   : typeof this.calsContext.daoContext !== 'undefined'
   ? this.calsContext.daoContext = new DAO()
   : this.clsDAO = this.calsContext.daoContext
 }

 async runMethod ({ objRequestParams, objReturn }) {
   calsLogger.param(objRequestParams)

   // 0. CALS-SDK 초기화
  await this.initCalsSdkForAplLambda(objRequestParams, this.clsRdkCoreLodash.cloneDeep(this.clsDAO))

   objRequestParams.bActiveStatus = await calsSdk.activate()
   if (CompareUtility.isNotEmpty(objRequestParams.bActiveStatus)) {
     throw new OperationFailException('CALS-SDK')
   }

   // 1. getDecryptKey Method 호출
   const objDecryptKey = await calsSdk.getDecryptKey({
     applicationId: objRequestParams.applicationId,
     accountId: objRequestParams.accountId,
     userId: objRequestParams.userId,
     arrDecryptItem: [
       {
         encData: '[qt_key_master ENC_DATA]',
         encDataKey: '[qt_key_master ENC_DATA_KEY]',
         keyId: '[qt_key_master SYS_ID]'
       }
     ]
   })

   if(objDecryptKey.success) {
     // 2-1. 성공일 경우 DecryptKey 확인
     console.log(objDecryptKey.payload.items)
   } else {
     // 2-2. 실패일 경우 에러 메세지 확인
     console.error(objDecryptKey.error.message)
   }

   // 3. 이후 DB 복호화 쿼리 수행
   this.setDAOParams({
     sDecryptKey: objDecryptKey.payload.items[0].decryptKey
   })
   objReturn = await this.clsDAO.getData({ objDAOParams: this.objDAOParams, objReturn })
  
   calsLogger.result(objReturn)
   return objReturn
 }
 // 여기까지 수정 가능 구역
}
  • src/dao.js
'use strict'

const { ApplicationDAO, calsLogger } = require('@cals-framework/lambda')

module.exports = class DAO extends ApplicationDAO {
 // 여기서부터 수정 가능 구역
 async getData ({ objDAOParams, objReturn }) {
   calsLogger.param(objDAOParams)
  
   const objDAOReturn = await this.select({
     sQueryId: 'selectTest1',
     objParam: objDAOParams,
     objReturn
   })
  
   calsLogger.result(objDAOReturn)
   return objDAOReturn
 }
 // 여기까지 수정 구역
}
  • query/mysql/mysql.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mysql">
 <select id="selectTest1">
   SELECT
      ${systemField}
      , CAST(AES_DECRYPT(UNHEX([COLUMN_NAME]), '${sDecryptKey}') AS CHAR) AS [COLUMN_NAME]
   FROM
     TEST_TABLE
   WHERE 1=1
     AND SYS_FLAG = 1
 </select>
</mapper>