Oracle-数据加密,导出脱敏函数

数据加密,脱敏时需要用到自定义函数来完成。

一、使用函数将数据值进行转换后,新建表存储。

/*加密函数*/
CREATE OR REPLACE FUNCTION DS_FUNC_ENCRYPT_DES(P_TEXT VARCHAR2,
                                               P_KEY  VARCHAR2)
  RETURN VARCHAR2 IS
  V_TEXT        VARCHAR2(4000);
  V_ENC         VARCHAR2(4000);
  RAW_INPUT     RAW(20000);
  KEY_INPUT     RAW(1000);
  DECRYPTED_RAW RAW(20000);
  V_ERRORTEXT   VARCHAR2(500);
BEGIN

  DBMS_OUTPUT.ENABLE(BUFFER_SIZE => NULL);

  IF (P_TEXT IS NULL OR P_TEXT = '') THEN
    RETURN '';
  END IF;
  DBMS_OUTPUT.PUT_LINE(P_TEXT);
  V_TEXT := RPAD(P_TEXT, (TRUNC(LENGTHB(P_TEXT) / 8) + 1) * 8, CHR(0));
  DBMS_OUTPUT.PUT_LINE(V_TEXT);
  RAW_INPUT := UTL_I18N.STRING_TO_RAW(V_TEXT, 'ZHS16GBK');
  KEY_INPUT := UTL_I18N.STRING_TO_RAW(P_KEY, 'ZHS16GBK');
  DBMS_OBFUSCATION_TOOLKIT.DESENCRYPT(INPUT          => RAW_INPUT,
                                      KEY            => KEY_INPUT,
                                      ENCRYPTED_DATA => DECRYPTED_RAW);
  V_ENC := RAWTOHEX(DECRYPTED_RAW);
  DBMS_OUTPUT.PUT_LINE(V_ENC);
  RETURN V_ENC;
EXCEPTION
  WHEN OTHERS THEN
    V_ERRORTEXT := 'dserror:' || SUBSTR(SQLERRM, 1, 200);
    RETURN V_ERRORTEXT;
END;

SELECT DS_FUNC_ENCRYPT_DES('字段名','加密字符') FROM TABLE_NAME;

二、使用导出命令将数据导出后解密转储。

/*解密函数*/
CREATE OR REPLACE FUNCTION DS_FUNC_DECRYPT_DES(P_TEXT VARCHAR2,
                                               P_KEY  VARCHAR2)
  RETURN VARCHAR2 IS
  P_TEXT_RAW  RAW(20000);
  P_KEY_RAW   RAW(20000);
  V_TEXT_RAW  RAW(20000);
  V_TEXT      VARCHAR2(4000);
  V_ERRORTEXT VARCHAR2(500);
BEGIN
  
  DBMS_OUTPUT.ENABLE(BUFFER_SIZE => NULL);
  
  IF (P_TEXT IS NULL OR P_TEXT = '') THEN
    RETURN '';
  END IF;
  P_TEXT_RAW := HEXTORAW(P_TEXT);
  P_KEY_RAW  := UTL_I18N.STRING_TO_RAW(P_KEY, 'ZHS16GBK');
  DBMS_OBFUSCATION_TOOLKIT.DESDECRYPT(INPUT          => P_TEXT_RAW,
                                      KEY            => P_KEY_RAW,
                                      DECRYPTED_DATA => V_TEXT_RAW);
  V_TEXT := UTL_I18N.RAW_TO_CHAR(V_TEXT_RAW, 'ZHS16GBK');
  DBMS_OUTPUT.PUT_LINE(V_TEXT);
  RETURN RTRIM(V_TEXT, CHR(0));
EXCEPTION
  WHEN OTHERS THEN
    V_ERRORTEXT := 'dserror:' || SUBSTR(SQLERRM, 1, 200);
    RETURN V_ERRORTEXT;
END;

SELECT DS_FUNC_DECRYPT_DES('字段名','加密字符') FROM TABLE_NAME;

猜你喜欢

转载自www.cnblogs.com/yangjn/p/12416757.html