DBMS_CRYPTO - bami74/me GitHub Wiki

  1. SYS๊ณ„์ •์œผ๋กœ ์•”ํ˜ธํ™” ํŒจํ‚ค์ง€๋ฅผ ์ƒ์„ฑํ•  ์œ ์ €์—๊ฒŒ ๊ถŒํ•œ์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
GRANT EXECUTE ON DBMS_OBFUSCATION_TOOLKIT TO [์œ ์ €๋ช…];
GRANT EXECUTE ON DBMS_CRYPTO TO [์œ ์ €๋ช…];
  1. ํŒจํ‚ค์ง€ ์ƒ์„ฑ ์Šคํฌ๋ฆฝํŠธ
Head Script
CREATE OR REPLACE PACKAGE [์œ ์ €๋ช…].CRYPTO_AES256
IS
/******************************************************************************
  ์•”ํ˜ธํ™”
 ******************************************************************************/
 FUNCTION ENC_AES ( input_string IN VARCHAR2
 ) RETURN VARCHAR2;

/******************************************************************************
  ๋ณตํ˜ธํ™”
 ******************************************************************************/
 FUNCTION DEC_AES (  encrypted_raw IN VARCHAR2
 ) RETURN VARCHAR2;                        

END CRYPTO_AES256;
/
Body Script
CREATE OR REPLACE PACKAGE BODY [์œ ์ €๋ช…].CRYPTO_AES256
IS
/******************************************************************************
  ์•”ํ˜ธํ™”
 ******************************************************************************/
 FUNCTION ENC_AES ( input_string IN VARCHAR2
 ) RETURN VARCHAR2
 IS
   encrypted_raw      RAW (2000);             -- ์•”ํ˜ธํ™”๋œ RAWํƒ€์ž… ๋ฐ์ดํ„ฐ
   key_bytes_raw      RAW (32);               -- ์•”ํ˜ธํ™” KEY (32RAW => 32Byte => 256bit)
   encryption_type    PLS_INTEGER :=          -- ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ์–ธ
                            DBMS_CRYPTO.ENCRYPT_AES256
                          + DBMS_CRYPTO.CHAIN_CBC
                          + DBMS_CRYPTO.PAD_PKCS5;
 
    BEGIN
        key_bytes_raw := UTL_I18N.STRING_TO_RAW('12345678901234567890123456789012', 'AL32UTF8');
        encrypted_raw := DBMS_CRYPTO.ENCRYPT
            (
                src => UTL_I18N.STRING_TO_RAW (input_string,  'AL32UTF8'),
                typ => encryption_type,
                key => key_bytes_raw
            );

        -- ์—๋Ÿฌ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด base64_encode๋กœ ์ธ์ฝ”๋”ฉ ์ฒ˜๋ฆฌ.. 
        -- ORA-06502: PL/SQL: numeric or value error: hex to raw conversion error
        RETURN UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(encrypted_raw));

    END ENC_AES;

/******************************************************************************
  ๋ณตํ˜ธํ™”
 ******************************************************************************/
 FUNCTION DEC_AES (  encrypted_raw IN VARCHAR2
 ) RETURN VARCHAR2
 IS
   output_string      VARCHAR2 (200);         -- ๋ณตํ˜ธํ™”๋œ ๋ฌธ์ž์—ด
   decrypted_raw      RAW (2000);             -- ๋ณตํ˜ธํ™”๋œ rawํƒ€์ž… ๋ฐ์ดํ„ฐ
   key_bytes_raw      RAW (32);               -- 256bit ์•”ํ˜ธํ™” key
   encryption_type    PLS_INTEGER :=          -- ๋ณตํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ์–ธ
                            DBMS_CRYPTO.ENCRYPT_AES256
                          + DBMS_CRYPTO.CHAIN_CBC
                          + DBMS_CRYPTO.PAD_PKCS5;
    BEGIN
        key_bytes_raw := UTL_I18N.STRING_TO_RAW('12345678901234567890123456789012', 'AL32UTF8');
        decrypted_raw := DBMS_CRYPTO.DECRYPT
            (
                -- ์—๋Ÿฌ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด base64_decode๋กœ ์ธ์ฝ”๋”ฉ ์ฒ˜๋ฆฌ.. 
                -- ORA-06502: PL/SQL: numeric or value error: hex to raw conversion error
                src => UTL_ENCODE.BASE64_DECODE(UTL_RAW.CAST_TO_RAW(encrypted_raw)),
                typ => encryption_type,
                key => key_bytes_raw
            );
       output_string := UTL_I18N.RAW_TO_CHAR (decrypted_raw, 'AL32UTF8');

       RETURN output_string;

    END DEC_AES;                        
END CRYPTO_AES256;
/
๊ฐ์ž ์›ํ•˜๋Š” ํ‚ค์ฝ”๋“œ(32byte) ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•˜๋ฉด ํ•ด๋‹น ํ‚ค๋กœ๋งŒ ๋ณตํ˜ธํ™” ํ•  ์ˆ˜ ์žˆ๋Š” ์•”ํ˜ธํ™” ๋ฌธ์ž์—ด์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
๋งŒ์•ฝ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ๋ ์‹œ ์กฐ์น˜๋ฐฉ๋ฒ•

PACKAGE BODY [์œ ์ €๋ช…].CRYPTO_AES256
On line:  7
PLS-00323: ๋ถ€ํ”„๋กœ๊ทธ๋žจ ๋˜๋Š” 'ENC_AES' ์ปค์„œ๋Š” ํŒจํ‚ค์ง€ ์ง€์ •์— ์ •์˜๋˜๊ณ  ํŒจํ‚ค์ง€ ๋ณธ์ฒด์— ๋‚˜ํƒ€๋‚˜์•ผํ•ฉ๋‹ˆ๋‹ค

Body Script๋ฅผ ๊ธ์–ด์„œ ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ๋ฅผ ์ง์ ‘์ œ๊ฑฐํ•˜๊ณ , Head์— ๋“ค์–ด๊ฐ€๋Š” ํ˜•์‹์œผ๋กœ ์ง์ ‘ ์ˆ˜์ • ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  Head์ƒ์„ฑ ํ›„ Body ์ƒ์„ฑ..
Head์™€ Body์— ๋ฌธ์ž์—ด์ด๋“  ์–ด๋–ค๊ฒƒ์ด๋“  ํ˜•์‹์ด ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์—๋Ÿฌ์ž…๋‹ˆ๋‹ค.

My crypto_aes256

create or replace package crypto_aes256 is

  /******************************************************************************
   ์•”ํ˜ธํ™”
  ******************************************************************************/
  function enc_aes(input_string in varchar2) return varchar2;

  /******************************************************************************
   ๋ณตํ˜ธํ™”
  ******************************************************************************/
  function dec_aes(encrypted_raw in varchar2) return varchar2;

end crypto_aes256;
create or replace package body crypto_aes256 is

  /********************************************************************************
  encryption
  ********************************************************************************/
  function enc_aes(input_string in varchar2) return varchar2 is
    return_base256 varchar2(256);
    encrypted_raw raw(2000); -- encryption raw type date
    key_bytes_raw raw(32); -- encryption key (32raw => 32byte => 256bit)
    encryption_type pls_integer :=  -- encryption
     dbms_crypto.encrypt_aes256 +
                                   dbms_crypto.chain_cbc +
                                   dbms_crypto.pad_pkcs5;
  begin
    if input_string is not null then
      key_bytes_raw := utl_i18n.string_to_raw('1234.567.8900!@#$%^&*()_+=      ',
                                              'AL32UTF8');
      encrypted_raw := dbms_crypto.encrypt(src => utl_i18n.string_to_raw(input_string,
                                                                         'AL32UTF8'),
                                           typ => encryption_type,
                                           key => key_bytes_raw);
      -- ORA-06502: PL/SQL: numeric or value error: hex to raw conversion error
      return_base256 := utl_raw.cast_to_varchar2(utl_encode.base64_encode(encrypted_raw));
    end if;
    return return_base256;
  end enc_aes;

  /********************************************************************************
  decryption
  ********************************************************************************/
  function dec_aes(encrypted_raw in varchar2) return varchar2 is
    output_string varchar2(200);
    decrypted_raw raw(2000); -- decryption raw type date
    key_bytes_raw raw(32); -- 256bit decryption key
    encryption_type pls_integer :=  -- decryption
     dbms_crypto.encrypt_aes256 +
                                   dbms_crypto.chain_cbc +
                                   dbms_crypto.pad_pkcs5;
  begin
    if encrypted_raw is not null then
      key_bytes_raw := utl_i18n.string_to_raw('1234.567.8900!@#$%^&*()_+=      ',
                                              'AL32UTF8');
      decrypted_raw := dbms_crypto.decrypt(
                                           -- ORA-06502: PL/SQL: numeric or value error: hex to raw conversion error
                                           src => utl_encode.base64_decode(utl_raw.cast_to_raw(encrypted_raw)),
                                           typ => encryption_type,
                                           key => key_bytes_raw);
      output_string := utl_i18n.raw_to_char(decrypted_raw, 'AL32UTF8');
    end if;
    return output_string;
  end dec_aes;

end crypto_aes256;
โš ๏ธ **GitHub.com Fallback** โš ๏ธ