Advertisement
Guest User

Untitled

a guest
May 22nd, 2017
2,465
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 9.80 KB | None | 0 0
  1.  
  2. #####################################################################################
  3.  KONA_USER, KONA_SQL_DATASOURCE 두개 테이블의 password 컬럼을 암호화 적용 작업절차
  4.     - KONA_USER 테이블의 패스워드는 이미 암호화되어 처리되고 있기때문에 제외
  5.     - 오라클 FUNCTION 예시
  6.               암호화 : XX1.ENC_VARCHAR2_INS(컬럼명,10,'SSNF')
  7.               복호화 : XX1.DEC_VARCHAR2_SEL(컬럼명,10,'SSNF')
  8. #####################################################################################              
  9.  
  10.  
  11. 1. 암호화 오라클 함수 TOGA 계정으로 접근여부
  12.      ex) grant EXECUTE, DEBUG ON "SSO_DEPT"."CRYPTO_AES256" TO "TOGA_SSGDPT_4_0" ;
  13.      
  14. 2. KONA_SQL_DATASOURCE 테이블 구조 확인필요(4.0 ORACLE기준)
  15.  
  16.         COLUMN_NAME       | DATA_TYPE          | NULLABLE  | DATA_DEFAULT | COLUMN_ID
  17.        -------------------|--------------------|-----------|--------------|------------
  18.         SQLDATASOURCE_ID  | VARCHAR2(5 BYTE)   | No        |    NULL      |      1    
  19.         NAME              | VARCHAR2(60 BYTE)  | No        |    NULL      |      2    
  20.         TYPE              | VARCHAR2(2 BYTE)   | Yes       |    NULL      |      3    
  21.         DRIVER_CLASSNAME  | VARCHAR2(60 BYTE)  | Yes       |    NULL      |      4    
  22.         URL               | VARCHAR2(500 BYTE) | Yes       |    NULL      |      5    
  23.         USERNAME          | VARCHAR2(60 BYTE)  | Yes       |    NULL      |      6    
  24.         PASSWORD          | VARCHAR2(60 BYTE)  | Yes       |    NULL      |      7    
  25.         INITIAL_SIZE      | NUMBER(10,0)       | Yes       |       0      |      8    
  26.         MAX_ACTIVE        | NUMBER(10,0)       | Yes       |      10      |      9    
  27.         MAX_IDLE          | NUMBER(10,0)       | Yes       |       0      |     10    
  28.         MAX_WAIT          | NUMBER(10,0)       | Yes       |      -1      |     11    
  29.         LOG_ABAND         | VARCHAR2(2 BYTE)   | Yes       |     'N'      |     12    
  30.         REMOVE_ABAND      | VARCHAR2(2 BYTE)   | Yes       |     'N'      |     13    
  31.         ABAND_TIMEOUT     | NUMBER(10,0)       | Yes       |     300      |     14    
  32.         VALIDATION_QUERY  | VARCHAR2(200 BYTE) | Yes       |    NULL      |     15  
  33.        
  34. 3. kona-engine.jar\com\eyeq\kona\persistence\sqlmaps\resource\JDBCResource.xml 아이큐내부소스와 신세계푸드 운영파일과 비교  
  35.      (다르다면 운영파일기반으로 수정)
  36.  
  37. 4. 상세 수정  
  38.  
  39.     - selectJDBCResources, selectJDBCResourceByID 수정 : * 를 전체 컬럼으로 수정, XX1.DEC_VARCHAR2_SEL(컬럼명,10,'SSNF') 적용
  40.             SELECT
  41.               SQLDATASOURCE_ID
  42.             , NAME
  43.             , TYPE
  44.             , DRIVER_CLASSNAME
  45.             , URL
  46.             , USERNAME
  47.             , XX1.DEC_VARCHAR2_SEL(PASSWORD,10,'SSNF') AS PASSWORD  --수정
  48.             , INITIAL_SIZE
  49.             , MAX_ACTIVE
  50.             , MAX_IDLE
  51.             , MAX_WAIT
  52.             , LOG_ABAND
  53.             , REMOVE_ABAND
  54.             , ABAND_TIMEOUT
  55.             , VALIDATION_QUERY
  56.             FROM KONA_SQL_DATASOURCE--4.0기준
  57.  
  58.     - insertJDBCResource, updateJDBCResource 수정 : password 컬럼에 XX1.ENC_VARCHAR2_INS(컬럼명,10,'SSNF') 함수 적용
  59.         INSERT INTO KONA_SQL_DATASOURCE
  60.         ( SQLDATASOURCE_ID
  61.         , NAME
  62.         , TYPE
  63.         , DRIVER_CLASSNAME
  64.         , URL
  65.         , USERNAME
  66.         , PASSWORD
  67.         , INITIAL_SIZE
  68.         , MAX_ACTIVE
  69.         , MAX_IDLE
  70.         , MAX_WAIT
  71.         , LOG_ABAND
  72.         , REMOVE_ABAND
  73.         , ABAND_TIMEOUT
  74.         , VALIDATION_QUERY)
  75.         VALUES
  76.         (#id:VARCHAR#
  77.         , #name:VARCHAR#
  78.         , #databaseType.code:VARCHAR#
  79.         , #driverClassName:VARCHAR#
  80.         , #url:VARCHAR#
  81.         , #userName:VARCHAR#
  82.         , XX1.ENC_VARCHAR2_INS(#password:VARCHAR#,10,'SSNF'),   --수정
  83.         , #initialSize:NUMERIC#
  84.         , #maxActive:NUMERIC#
  85.         , #maxIdle:NUMERIC#
  86.         , #maxWait:NUMERIC#
  87.         , #logAbandoned:VARCHAR#
  88.         , #removeAbandoned:VARCHAR#
  89.         , #removeAbandonedTimeout:NUMERIC#
  90.         , #validationQuery:VARCHAR#)
  91.        
  92.        
  93.         UPDATE KONA_SQL_DATASOURCE SET
  94.             NAME =#name:VARCHAR#,
  95.             TYPE =#databaseType.code:VARCHAR#,
  96.             DRIVER_CLASSNAME =#driverClassName:VARCHAR#,
  97.             URL =#url:VARCHAR#,
  98.             USERNAME =#userName:VARCHAR#,
  99.             PASSWORD =XX1.ENC_VARCHAR2_INS(#password:VARCHAR#,10,'SSNF'),  --수정
  100.             INITIAL_SIZE =#initialSize:NUMERIC#,
  101.             MAX_ACTIVE =#maxActive:NUMERIC#,
  102.             MAX_IDLE =#maxIdle:NUMERIC#,
  103.             MAX_WAIT =#maxWait:NUMERIC#,
  104.             LOG_ABAND =#logAbandoned:NUMERIC#,
  105.             REMOVE_ABAND =#removeAbandoned:NUMERIC#,
  106.             ABAND_TIMEOUT =#removeAbandonedTimeout:NUMERIC#,
  107.             VALIDATION_QUERY =#validationQuery:VARCHAR#
  108.  
  109. 5. 변경 된 kona-engine.jar 파일을 kona, droplets 양쪽에 적용(필요에따라 JDBCResource.xml 파일만 적용)
  110.  
  111. 6. 기존 연결 확인, 수정, 신규등록 테스트
  112.     - SELECT : 개발자서비스 디비연결 통해 등록된 연결 확인
  113.     - INSERT : 신규연결 시 암호회된 데이터 디비저장확인
  114.     - UPDATE : 기존 데이터 수정 확인
  115.  
  116.  
  117.  
  118. 참고) 사전준비
  119.       :  내부 오라클 디비에 암복호 화 펑션 구현(http://yangyag.tistory.com/303 참고)
  120.  
  121.        
  122.     1. SYSDBA 권한으로 해당 유저에게 권한을 부여한다.
  123.           : CMD 창에서
  124.                 sqlplus "/as sysdba"    
  125.             실행
  126.             GRANT EXECUTE ON DBMS_OBFUSCATION_TOOLKIT TO [유저명];
  127.             GRANT EXECUTE ON DBMS_CRYPTO TO [유저명];
  128.            
  129.     2. Head 패키지를 선언
  130.         CREATE OR REPLACE PACKAGE CRYPTO_AES256
  131.         IS
  132.                 /********************************************************************************
  133.                 encryption
  134.                 ********************************************************************************/
  135.                 FUNCTION ENC_AES(input_string IN VARCHAR2)
  136.                         RETURN VARCHAR2;
  137.                 /********************************************************************************
  138.                 decryption
  139.                 ********************************************************************************/
  140.                 FUNCTION DEC_AES(encrypted_raw IN VARCHAR2)
  141.                         RETURN VARCHAR2;
  142.         END CRYPTO_AES256;
  143.        
  144.     3. BODY 패키지를 선언
  145.         CREATE OR REPLACE PACKAGE BODY CRYPTO_AES256
  146.         IS
  147.                 /********************************************************************************
  148.                 encryption
  149.                 ********************************************************************************/
  150.                 FUNCTION ENC_AES(input_string IN VARCHAR2)
  151.                         RETURN VARCHAR2
  152.                 IS
  153.                         return_base256 VARCHAR2(256);
  154.                         encrypted_raw RAW (2000);      -- encryption raw type date
  155.                         key_bytes_raw RAW (32);        -- encryption key (32raw => 32byte => 256bit)
  156.                         encryption_type PLS_INTEGER := -- encryption
  157.                         DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
  158.                 BEGIN
  159.                         IF input_string       IS NOT NULL THEN
  160.                                 key_bytes_raw := UTL_I18N.STRING_TO_RAW('WKAF3xv7y,d5SZpzT8ftJR).shEQn#%@', 'AL32UTF8');
  161.                                 encrypted_raw := DBMS_CRYPTO.ENCRYPT ( src => UTL_I18N.STRING_TO_RAW(input_string, 'AL32UTF8'), typ => encryption_type, KEY => key_bytes_raw );
  162.                                 -- ORA-06502: PL/SQL: numeric or value error: hex to raw conversion error
  163.                                 return_base256 := UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(encrypted_raw));
  164.                         END IF;
  165.                         RETURN return_base256;
  166.                 END ENC_AES;
  167.              
  168.             /********************************************************************************
  169.             decryption
  170.             ********************************************************************************/
  171.                 FUNCTION DEC_AES(encrypted_raw IN VARCHAR2)
  172.                         RETURN VARCHAR2
  173.                 IS
  174.                         output_string VARCHAR2 (200);
  175.                         decrypted_raw RAW (2000);      -- decryption raw type date
  176.                         key_bytes_raw RAW (32);        -- 256bit decryption key
  177.                         encryption_type PLS_INTEGER := -- decryption
  178.                         DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
  179.                 BEGIN
  180.                         IF encrypted_raw      IS NOT NULL THEN
  181.                                 key_bytes_raw := UTL_I18N.STRING_TO_RAW('WKAF3xv7y,d5SZpzT8ftJR).shEQn#%@', 'AL32UTF8');
  182.                                 decrypted_raw := DBMS_CRYPTO.DECRYPT (
  183.                                 -- ORA-06502: PL/SQL: numeric or value error: hex to raw conversion error
  184.                                 src => UTL_ENCODE.BASE64_DECODE(UTL_RAW.CAST_TO_RAW(encrypted_raw)), typ => encryption_type, KEY => key_bytes_raw );
  185.                                 output_string := UTL_I18N.RAW_TO_CHAR(decrypted_raw, 'AL32UTF8');
  186.                         END IF;
  187.                         RETURN output_string;
  188.                 END DEC_AES;
  189.         END CRYPTO_AES256;
  190.        
  191.     4. 사용법
  192.         -- AES256 암호화
  193.         SELECT CRYPTO_AES256.ENC_AES('컬럼명') FROM 테이블 명;
  194.          
  195.         -- AES256 복호화
  196.         SELECT CRYPTO_AES256.DEC_AES('복호화 할 컬럼') FROM 테이블 명;
  197.        
  198.     5. 생성된 펑션 접근권한추가
  199.         - 계정명 : "TOGA_SSGDPT_4_0"
  200.               grant EXECUTE, DEBUG ON "SSO_DEPT"."CRYPTO_AES256" TO "TOGA_SSGDPT_4_0" ;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement