数据加密,脱敏时需要用到自定义函数来完成。
一、使用函数将数据值进行转换后,新建表存储。
/*加密函数*/ 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;