SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; SET AUTOCOMMIT OFF; DROP TABLE profile; CREATE TABLE profile ( username varchar2(20) not null, passwd raw(16) not null, CONSTRAINT cons_profile_key primary key(username) ); CREATE OR REPLACE PACKAGE toolkit AS FUNCTION encrypt (p_text IN VARCHAR2) RETURN RAW; FUNCTION decrypt (p_raw IN RAW) RETURN VARCHAR2; END toolkit; / CREATE OR REPLACE PACKAGE BODY toolkit AS g_key RAW(32767) := UTL_RAW.cast_to_raw('12323678'); g_pad_chr VARCHAR2(1) := '~'; PROCEDURE padstring (p_text IN OUT VARCHAR2); -- -------------------------------------------------- FUNCTION encrypt (p_text IN VARCHAR2) RETURN RAW IS -- -------------------------------------------------- l_text VARCHAR2(32767) := p_text; l_encrypted RAW(32767); BEGIN padstring(l_text); DBMS_OBFUSCATION_TOOLKIT.desencrypt(input => UTL_RAW.cast_to_raw(l_text), key => g_key, encrypted_data => l_encrypted); RETURN l_encrypted; END; -- -------------------------------------------------- -- -------------------------------------------------- FUNCTION decrypt (p_raw IN RAW) RETURN VARCHAR2 IS -- -------------------------------------------------- l_decrypted VARCHAR2(32767); BEGIN DBMS_OBFUSCATION_TOOLKIT.desdecrypt(input => p_raw, key => g_key, decrypted_data => l_decrypted); RETURN RTrim(UTL_RAW.cast_to_varchar2(l_decrypted), g_pad_chr); END; -- -------------------------------------------------- -- -------------------------------------------------- PROCEDURE padstring (p_text IN OUT VARCHAR2) IS -- -------------------------------------------------- l_units NUMBER; BEGIN IF LENGTH(p_text) MOD 8 > 0 THEN l_units := TRUNC(LENGTH(p_text)/8) + 1; p_text := RPAD(p_text, l_units * 8, g_pad_chr); END IF; END; -- -------------------------------------------------- END toolkit; / CREATE OR REPLACE TRIGGER profile_trig BEFORE INSERT OR UPDATE ON profile FOR EACH ROW DECLARE BEGIN :new.passwd:= toolkit.encrypt(UTL_RAW.cast_to_varchar2(:new.passwd)); END; / INSERT INTO profile(username, passwd) VALUES ('tim_hall', UTL_RAW.cast_to_raw('My Secret Data')); SELECT * FROM profile; COLUMN passwd FORMAT A40; SELECT username, toolkit.decrypt(passwd) AS passwd FROM profile;