KMS Decrypt (CALS-SDK)
1. 시나리오
- CALS-Studio > Utility > Key Management에서
Algorithm
이KMS-AES
이고,Manage Type
을External
또는Application
로 설정한 경우 해당 복호화 Key 정보를 조회하는 로직 작성
2. 인터페이스 정의
- Request Parameter
요소 명 | 하위 요소 명 | 데이터 타입 | 요구 수준 | 설명 |
---|---|---|---|---|
applicationId | String | Required | 복호화 Key 정보를 가져올 Application 의 SYS_ID | |
accountId | String | Required | 복호화 Key 정보를 가져올 Account 의 SYS_ID | |
userId | String | Required | 복호화 Key 정보를 가져올 사용자의 SYS_ID | |
arrDecryptItem | Array[Object] | Required | 복호화 Key 정보를 가져오기 위한 배열 객체 | |
keyId | String | Required | Application/External DB 의 qt_key_master 테이블에서 복호화 Key 정보를 가져올 Row 의 SYS_ID | |
encDataKey | String | Required | Application/External DB 의 qt_key_master 테이블에서 복호화 Key 정보를 가져올 Row 의 ENC_DATA_KEY 값 | |
encData | String | Required | Application/External DB 의 qt_key_master 테이블에서 복호화 Key 정보를 가져올 Row 의 ENC_DATA 값 |
- Response Parameter
요소 명 | 하위 요소 명 | 2차 하위 요소명 | 데이터 타입 | 설명 |
---|---|---|---|---|
success | Boolean | API 요청 성공 실패 여부 [true / false] | ||
error | Object | Error 정보 객체 | ||
code | Integer | 에러 코드 | ||
type | String | 에러 타입 | ||
message | String | 에러 메세지 | ||
payload | Object | 응답 객체 | ||
items | Array[Object] | 복호화된 데이터 배열 객체 | ||
decryptKey | String | 복호화 Key | ||
keyId | String | Application/External DB 의 qt_key_master 테이블에서 복호화 Key 정보를 가져올 Row 의 SYS_ID | ||
encData | String | Application/External DB 의 qt_key_master 테이블에서 복호화 Key 정보를 가져올 Row 의 ENC_DATA 값 | ||
encDataKey | String | Application/External DB 의 qt_key_master 테이블에서 복호화 Key 정보를 가져올 Row 의 ENC_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>