Wrap方式加密安全
Wrap的限制:app
1.此方法對加密相似密碼的東西,不是很安全。函數
2.加密後的文件對於通常人來講,是比較安全的,可是對於專業人士來講,也是形同虛設的。加密
3.不能加密觸發器。spa
4.加密的過程當中,是不會檢查你的語法錯誤的,只是在編譯的時候會檢查。code
5.他是向上兼容的,依賴於Oracle的版本,好比是8.1.5的加密文件,能夠在8.1.6的版本上跑,可是blog
8.1.6版本的Oracle加密文件,在8.1.5上不必定能跑。io
6.只能加密以下類型,不能加密匿名塊編譯
CREATE [OR REPLACE] FUNCTION function_name CREATE [OR REPLACE] PROCEDURE procedure_name CREATE [OR REPLACE] PACKAGE package_name CREATE [OR REPLACE] PACKAGE BODY package_name CREATE [OR REPLACE] TYPE type_name AS OBJECT CREATE [OR REPLACE] TYPE type_name UNDER type_name CREATE [OR REPLACE] TYPE BODY type_name
DBMS_DDL包含了加密存儲過程,函數,類型說明,類型體,包說明,包體,此子程序提供了動態生成PLSQL單元的能力。其實內部就是一個WRAP函數和一個CREATE_WRAPPED存儲過程。再加上一個異常處理的單元MALFORMED_WRAP_INPUT。function
固然調用DBMS_DDL.CREATE_WRAPPED的時候必須保證你的本地沒有生命這樣的存儲過程,或者你在調用的時候要加上SYS.DBMS_DDL
.WRAP
or SYS.DBMS_DDL
.CREATE_WRAPPED,這個時候就得有執行這兩個存儲過程的權限了。
DECLARE package_text VARCHAR2(32767); -- text for creating package spec & body FUNCTION generate_spec (pkgname VARCHAR2) RETURN VARCHAR2 AS BEGIN RETURN 'CREATE PACKAGE ' || pkgname || ' AS PROCEDURE raise_salary (emp_id NUMBER, amount NUMBER); PROCEDURE fire_employee (emp_id NUMBER); END ' || pkgname || ';'; END generate_spec; FUNCTION generate_body (pkgname VARCHAR2) RETURN VARCHAR2 AS BEGIN RETURN 'CREATE PACKAGE BODY ' || pkgname || ' AS PROCEDURE raise_salary (emp_id NUMBER, amount NUMBER) IS BEGIN UPDATE employees SET salary = salary + amount WHERE employee_id = emp_id; END raise_salary; PROCEDURE fire_employee (emp_id NUMBER) IS BEGIN DELETE FROM employees WHERE employee_id = emp_id; END fire_employee; END ' || pkgname || ';'; END generate_body; BEGIN -- Generate package spec package_text := generate_spec('emp_actions') -- Create wrapped package spec DBMS_DDL.CREATE_WRAPPED(package_text); -- Generate package body package_text := generate_body('emp_actions'); -- Create wrapped package body DBMS_DDL.CREATE_WRAPPED(package_text); END; /
值得注意的是當你調用DBMS_SQL
.PARSE這個函數去解析
DBMS_DDL
.WRAP這個加密的結果的時候,傳入的文本超多了32767 bytes,你就必須設置
LFFLG爲FALSE,不然DBMS_SQL
.PARSE這個解析的結果將是混亂的