티스토리 뷰

[프로그래밍/AWS] - [AWS] AWS KMS(CMK) 암복호화

 

[AWS] AWS KMS(CMK) 암복호화

AWS KMS KMS는 크게 3가지 방식으로 key 관리 서비스를 제공한다. AWS managed key AWS managed key는  AWS 서비스들이 KMS를 통해 key를 서비스받는 것으로, AWS 자체적으로 동작하기 때문에 직접 제어가 불가..

reference-m1.tistory.com

 

이전 포스팅에서 AWS KMS(CMK) 암복호화에 대해 알아보았다. 이번에는 Mybatis typeHandler를 사용하여 DML문장에서 암복호화가 되도록 해보자.

 

1. typeHandler Override


import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

import com.tistory.reference.common.util.AWSCipher;

import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

public class AESStringTypeHandler extends BaseTypeHandler<String> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
    
        if (!StringUtils.isEmpty(parameter)) {
            parameter = AWSCipher.encrypt(parameter);
        }
        ps.setString(i, parameter);
    }

    @Override
    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
    
        String value = rs.getString(columnName);
    
        if (StringUtils.isEmpty(value)) {
            return null;
        } else {
            return AWSCipher.decrypt(value);
        }
    }

    @Override
    public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        
        ResultSetMetaData rsmd = rs.getMetaData();
        String columnName = rsmd.getCatalogName(columnIndex);
        String value = rs.getString(columnIndex);

        if (StringUtils.isEmpty(value)) {
            return null;
        } else {
            return AWSCipher.decrypt(value);
        }
    }

    @Override
    public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        ResultSet rs = cs.getResultSet();

        ResultSetMetaData rsmd = rs.getMetaData();
        String columnName = rsmd.getCatalogName(columnIndex);
        String value = rs.getString(columnIndex);

        if (StringUtils.isEmpty(value)) {
            return null;
        } else {
            return AWSCipher.decrypt(value);
        }
    }
}

 

2. application.yml 설정

mybatis:
  type-handlers-package: com.tistory.reference.common.typehandler.AESStringTypeHandler

 

3. 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="com.tistory.reference.api.user.mapper.IUserMapper">

    <resultMap type="com.tistory.reference.api.user.model.userDTO" id="userDtoMap">
        <result column="ECYPN_BRTH_DT" property="brthDt" typeHandler="com.tistory.reference.common.typehandler.AESStringTypeHandler"/>
        <result column="ECYPN_TLNO"    property="tlno"   typeHandler="com.tistory.reference.common.typehandler.AESStringTypeHandler"/>
    </resultMap>


    <select id="selectUserList" resultMap="userDtoMap">
        /* IUserMapper.selectUserList: 사용자 조회 */
        SELECT ECYPN_BRTH_DT
             , ECYPN_TLNO
          FROM USR_INF_BAS
         WHERE DEL_YN = 'N'
    </select>

    <update id="updateUser" parameterType="com.tistory.reference.api.user.model.userDTO">
        /* IUserMapper.updateUser: 사용자 수정 */
        UPDATE USR_INF_BAS
           SET MOD_DTM = NOW()
             , MOD_USR_ID = #{usrId}
             , ECYPN_BRTH_DT = #{brthDt, com.tistory.reference.common.typehandler.AESStringTypeHandler}
             , ECYPN_TLNO = #{tlno, com.tistory.reference.common.typehandler.AESStringTypeHandler}
         WHERE DEL_YN = 'N'
           AND USR_ID = #{usrId}
    </update>
</mapper>

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함