oracle wrap和unwrap.docx
- 文档编号:8175911
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:18
- 大小:194.37KB
oracle wrap和unwrap.docx
《oracle wrap和unwrap.docx》由会员分享,可在线阅读,更多相关《oracle wrap和unwrap.docx(18页珍藏版)》请在冰豆网上搜索。
oraclewrap和unwrap
因为前段时间发给同事的脚本里我使用了oracle的wrap算法,对脚本进行了加密,类型这样的:
createorreplaceprocedurekill_sessionwrapped
a000000
354
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
7
8563c9
mzFwVBq6htzxvb9LJDwd5lo05JEwgzuJTCATfI5Av1UPUujcZVoU8pihtzxj06hIHo2mFegM
GqHjGxE1bDWeGvZj+c4xi9oU0ui8+yxPx+QiZLJK9v0w/L4E21NJ6CleWT4tYpUIPlisQ9cb
tD2pcksM9QPnTWd9iN3W0MFGZZNx2N3Qf1/iXYOieLkgTAUD6FUq69+57qKQyK8dkA29vGxv
cg602zkd1r/JlwIjG9P0lYoJSnRoUzN0HLyOIWbS+MvH3PsqOb1JTmfBm8BhTs81vJlsXTmJ
8aWrYMVL2lbapFxp3k0tbTDq8j7UhhOTknTHeK/CiMYq11Fa/OCZW2py9qV2W5ieI3Snrqq/
+j+Y5ieC8Ku/MOjZYDLAkuwckaTx/i2c0vCCfrq4l0aXOVIVXNh5+2nwrl2UfCp13PWaQeQG
7Ra0Aem50ABHH88+VXbxKek9CRh4ByVm4DcJcBf9GidjWzGZCT2f6T0Jb0oKR49/y7M10aQJ
6ILQPN6vZW1B0EMy7Tun3M66e1Z5V9IzoJiNnTrqJeMsmMnwChv7faySQHl/eheeg7Du0Wgi
77Jpb7nfs9/jvkxnqw06Fu0u/rOGSKW7Etl3bgOdEPGS4DyaAKGnCCdOgEglV2rgGTEITUNz
6kXf7c6V9Xlb3cd+MF+aJjF0rvT/mmkvx6qpqmmTUzewFkqosush8mGpL6zExHECMDXsdSzT
YWCBSZQpz3clS6FSjHc9vZW8uVcbf/XU0HfG4vaYl4/AIasQhuLR8QDY1sFiscg7anFUS3I8
+tGXhyTvDbNYE+ZIl0L2TxlMvCftFuDK7Lp/U9yMPc5Qsj99zC9P0JoyY4Z02NPLp73dL+Hj
t0NeU+E6WN9Q7HCy2IdN2f4OInQmso5jyIqsAXbmcyyWlgkCwx1cV+18H3N8LEbA0pEVnBbX
JeZCJhMkZCJzW/qXTso=
/
当时加密当然主要是出于安全方面的考虑,正好有同事感兴趣,我们来说下oracle的wrap问题。
加密的意义对是一些直接对表的实际数据进行操作、或者是对数据库进行修改的基础类的方法、过程、包等,然后被其他的过程方法调用,但这些基础类的方法过程不宜被所有人看到具体的代码(即有可能看到的人有修改的权力),需要使用加密。
其实oracle的一些非常核心的算法过程,都是被加密过的。
若我们的系统中的部分核心代码有需要,亦可以使用wrap的功能,貌似report系统中只有一个包使用了wrap。
因为10g跟11g的不通用,我们只说下10g跟之前的。
文章我直接借Dave的了,他写的非常详细了。
我只在后面加上一个淘宝大牛写的小程序,专门来破解oracle的wrap的。
有兴趣的可以拿去用下。
一.Wrap说明
官网的说明如下:
APL/SQLSourceTextWrapping
YoucanwrapthePL/SQLsourcetextforanyofthesestoredPL/SQLunits,therebypreventinganyonefromdisplayingoreditingthattext:
(1)Packagespecification
(2)Packagebody
(3)Typespecification
(4)Typebody
(5)Function
(6)Procedure
AfilecontainingwrappedPL/SQLsourcetextiscalledawrappedfile.Awrappedfilecanbemoved,backedup,orprocessedbySQL*PlusortheImportandExportutilities.
Toproduceawrappedfile,useeitherthePL/SQLWrapperutilityoraDBMS_DDLsubprogram.ThePL/SQLWrapperutilitywrapsthesourcetextofeverywrappablePL/SQLunitcreatedbyaspecifiedSQLfile.TheDBMS_DDLsubprogramswrapthesourcetextofsingledynamicallygeneratedwrappablePL/SQLunits.
BoththePL/SQLWrapperutilityandDBMS_DDLsubprogramsdetecttokenizationerrors(forexample,runawaystrings),butnotsyntaxorsemanticerrors(forexample,nonexistenttablesorviews).
Wrappedfilesareupward-compatiblebetweenOracleDatabasereleases.Forexample,youcanloadfilesproducedbytheV8.1.5PL/SQLWrapperutilityintoaV8.1.6OracleDatabase.
itpub上有篇文章提到了wrap加密的原理:
From:
Oracle加密的原理就是先对源码进行lz压缩lzstr,然后对压缩数据进行SHA-1运算得到40位的加密串shstr,然后将加密串与压缩串拼接得到shstr+lzstr,然后对拼接后的字符串进行Oracle双字符转换(转换表)。
最后将转换后的字符串进行base64编码,最终得到wrap的加密串。
Thedefaultfileextensionforinput_fileissql.Thedefaultnameofoutput_fileisinput_file.plb.Therefore,thesecommandsareequivalent:
wrapiname=/mydir/myfile
wrapiname=/mydir/myfile.sqloname=/mydir/myfile.plb
Thisexamplespecifiesadifferentfileextensionforinput_fileandadifferentnameforoutput_file:
wrapiname=/mydir/myfile.srconame=/yourdir/yourfile.out
wrap的使用步骤如下:
(1)将我们要加密的sql语句保存到一个sql文本里。
(2)用wrap进行处理,指定输入的sql,即我们第一步的问题,然后指定输出的路径和文件名,默认扩展名是plb。
(3)执行我们第二部进过wrap处理的sql,即plb文件,创建我们的对象.
示例1:
wrapfuncation
--函数
CREATEORREPLACEFUNCTIONF_DAVE(
nint
)RETURNstring
IS
BEGIN
IFn=1THEN
RETURN'DaveisDBA!
';
ELSIFn=2THEN
RETURN'DavecomefromAnQing!
';
ELSE
RETURN'DavecomefromHuaiNing!
';
ENDIF;
END;
/
SYS@dave2(db2)>selectF_DAVE(4)fromdual;
F_DAVE(4)
--------------------------------------------------------------------------------
DavecomefromHuaiNing!
BTW:
今天群里有人问我的blog的例子里为啥有安庆,因为我是安庆怀宁人。
[oracle@db2~]$pwd
/home/oracle
[oracle@db2~]$catdave.sql
CREATEORREPLACEFUNCTIONF_DAVE(
nint
)RETURNstring
IS
BEGIN
IFn=1THEN
RETURN'DaveisDBA!
';
ELSIFn=2THEN
RETURN'DavecomefromAnQing!
';
ELSE
RETURN'DavecomefromHuaiNing!
';
ENDIF;
END;
/
[oracle@db2~]$wrapiname=dave.sql
PL/SQLWrapper:
Release10.2.0.1.0-ProductiononThuAug1822:
59:
142011
Copyright(c)1993,2004,Oracle.Allrightsreserved.
Processingdave.sqltodave.plb
[oracle@db2~]$ls
bifile.bbddave.plbdave.sqlDesktoplog.bbd
[oracle@db2~]$catdave.plb
CREATEORREPLACEFUNCTIONF_DAVEwrapped
a000000
1
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
8
10de7
S9NWrpt8q6tkKEMxCcfYJz2aLF4wgxDQLZ4VfC9AkE6OnV4ydypXGhveHcDg8UXy98WIg6xR
crtc/BRdQJjutbna/9+g0LlaSx87/znV+y926S1AeC0IRi/tjPJTyvJereDdk8mftMo8QMjV
fw0xXn0zVagAawwNVhSAiy/JPTMKkrBkC5ruMwQSTe6JQNq7Q2QtJV0hgQou0rYuet4/gJ5B
wAj75ph6EA==
/
SYS@dave2(db2)>@dave.plb
--再次调用函数,正常使用:
SYS@dave2(db2)>selectF_DAVE(4)fromdual;
F_DAVE(4)
--------------------------------------------------------------------------------
DavecomefromHuaiNing!
--查看函数源码,已经加过密了:
SYS@dave2(db2)>selecttextfromdba_sourcewherename='F_DAVE';
TEXT
--------------------------------------------------------------------------------
FUNCTIONF_DAVEwrapped
a000000
1
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
TEXT
--------------------------------------------------------------------------------
abcd
abcd
abcd
abcd
abcd
abcd
abcd
8
10de7
S9NWrpt8q6tkKEMxCcfYJz2aLF4wgxDQLZ4VfC9AkE6OnV4ydypXGhveHcDg8UXy98WIg6xR
crtc/BRdQJjutbna/9+g0LlaSx87/znV+y926S1AeC0IRi/tjPJTyvJereDdk8mftMo8QMjV
TEXT
--------------------------------------------------------------------------------
fw0xXn0zVagAawwNVhSAiy/JPTMKkrBkC5ruMwQSTe6JQNq7Q2QtJV0hgQou0rYuet4/gJ5B
wAj75ph6EA==
示例2:
SYS.DBMS_DDL函数
thedbms_ddlpackageprovideswrapfunctionsandcreate_wrappedprocedures,eachofwhichwrapsthepl/sqlsourcetextofasingledynamicallygeneratedwrappablepl/sqlunit.
TheDBMS_DDLpackagealsoprovidestheexceptionMALFORMED_WRAP_INPUT(ORA-24230),whichisraisediftheinputtoWRAPorCREATE_WRAPPEDisnotavalidwrappablePL/SQLunit.(ForthelistofwrappablePL/SQLunits,seetheintroductionto"PL/SQLSourceTextWrapping".)
EachWRAPfunctiontakesasinputasingleCREATEstatementthatcreatesawrappablePL/SQLunitandreturnsanequivalentCREATEstatementinwhichthePL/SQLsourcetextiswrapped.FormoreinformationabouttheWRAPfunctions,seeOracleDatabasePL/SQLPackagesandTypesReference.
EachCREATE_WRAPPEDproceduredoeswhatitscorrespondingWRAPfunctiondoesandthenrunsthereturnedCREATEstatement,creatingthespecifiedPL/SQLunit.FormoreinformationabouttheCREATE_WRAPPEDprocedures。
该示例直接参考官方文档:
DECLARE
package_textVARCHAR2(32767);--textforcreatingpackagespecandbody
FUNCTIONgenerate_spec(pkgnameVARCHAR2)RETURNVARCHAR2AS
BEGIN
RETURN'CREATEPACKAGE'||pkgname||'AUTHIDDEFINERAS
PROCEDUREraise_salary(emp_idNUMBER,amountNUMBER);
PROCEDUREfire_employee(emp_idNUMBER);
END'||pkgname||';';
ENDgenerate_spec;
FUNCTIONgenerate_body(pkgnameVARCHAR2)RETURNVARCHAR2AS
BEGIN
RETURN'CREATEPACKAGEBODY'||pkgname||'AS
PROCEDUREraise_salary(emp_idNUMBER,amountNUMBER)IS
BEGIN
UPDATEemployees
SETsalary=salary+amountWHEREemployee_id=emp_id;
ENDraise_salary;
PROCEDUREfire_employee(emp_idNUMBER)IS
BEGIN
DELETEFROMemployeesWHEREemployee_id=emp_id;
ENDfire_employee;
END'||pkgname||';';
ENDgenerate_body;
BEGIN
package_text:
=generate_spec('emp_actions');--Generatepackagespec
EXECUTEIMMEDIATEpackage_text;--Createpackagespec
package_text:
=generate_body('emp_actions');--Generatepackagebody
SYS.DBMS_DDL.CREATE_WRAPPED(package_text);--Createwrappedpackagebody
END;
/
二.Unwrap说明
wrap的目的是为了加密,所以Oracle并没有提供unwrap的方法。
itpub上的一些牛人研究了一下这个问题,写了一些unwrap的代码。
具体讨论的过程,参考itpub的2个帖子:
我这里贴一下unwrap的代码:
/*Formattedon2011/8/1812:
59:
54(QP5v5.163.1008.3004)*/
CREATEORREPLACEPACKAGEamosunwrapper
IS
FUNCTIONdeflate(srcINVARCHAR2)
RETURNRAW;
FUNCTIONdeflate(srcINVARCHAR2,qualityINNUMBER)
RETURNRAW;
FUNCTIONinflate(srcINRAW)
RETURNVARCHAR2;
END;
/
CREATEORREPLACEPACKAGEBODYamosunwrapper
IS
FUNCTIONdeflate(srcINVARCHAR2)
RETURNRAW
IS
BEGIN
RETURNdeflate(src,6);
END;
FUNCTIONdeflate(srcINVARCHAR2,qualityINNUMBER)
RETURNRAW
AS
LANGUAGEJAVA
NAME'UNWRAPPER.Deflate(java.lang.String,int)returnbyte[]';
FUNCTIONinflate(srcINRAW)
RETURNVARCHAR2
AS
LANGUAGEJAVA
NAME'UNWRAPPER.Inflate(byte[])returnjava.lang.String';
END;
/
/*Formattedon2011/8/1813:
00:
16(QP5v5.163.1008.3004)*/
CREATEORREPLACEJAVASOURCENAMEDUNWRAPPER
ASimportjava.io.*;
importjava.util.zip.*;
publicclassUNWRAPPER
{
publicstaticStringInflate(byte[]src)
{
try
{
ByteArrayInputStreambis=newByteArrayInputStream(src);
InflaterInputStreamiis=newInflaterInputStream(bis);
StringBuffersb=newStringBuffer();
for(intc=iis.read();c!
=-1;c=iis.read())
{
sb.append((char)c);
}
returnsb.toString();
}catch(Exceptione)
{
}
returnnull;
}
publicstaticbyte[]Deflate(Stringsrc,intquality)
{
try
{
byte[]tmp=newbyte[src.length()+100];
Deflaterdefl=newDeflater(quality);
defl.setInput(src.getBytes("UTF-8"));
defl.finish();
intcnt=defl.deflate(tmp);
byte[]res=newbyte[cnt
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- oracle wrap和unwrap wrap unwrap
![提示](https://static.bdocx.com/images/bang_tan.gif)