背景:我想对我编写的加密解密用wrap进行代码包装加密。1、我创建的一个包,里面有密钥和加密解码的方法,由于要保护密钥不被人偷窃,所以我对这个程序进行wrap加密
2、将我上面创建的PL/SQL程序保存为source.sql,放在E盘下。
3、打开Dos命令,对source.sql进行加密
E:\>wrap iname=source.sql oname=p_encrypt_decrypt.sqlPL/SQL Wrapper: Release 10.2.0.1.0- 64bit Production on 星期五 1月 29 10:24:40 2010Copyright (c) 1993, 2004, Oracle. All rights reserved.Processing source.sql to p_encrypt_decrypt.sql4、Dos命令下运行p_encrypt_decrypt.sql,即可见包为密文了
5、然后PL/SQL developer 下运行p_encrypt_decrypt.sqlSQL> @e:\p_encrypt_decrypt.sql;Package createdWarning: Package body created with compilation errorsSQL> set serveroutput on ;
SQL> show error
Errors for PACKAGE BODY SYS.P_ENCRYPT_DECRYPT:LINE/COL ERROR
-------- ---------------------------------------------------------------------------------------------
29/8     PLS-00114: 标识符 'SOZFVSJOJTKQIU25X3JYSVCUY3W6RW' 太长
29/2     PLS-00103: 出现符号 "W"
29/56    PLS-00103: 出现符号 "="在需要下列之一时:   . ( , * @ % & -     + / at mod remainder rem <an identifier>     <a double-quoted delimited-identifier> <an exponent (**)> as     from into || bulk  
6、最后打开p_encrypt_decrypt包,即会显示/* Source is wrapped */
但是包有错误
7、我直接包我写的加密解密程序放在PL/SQL developer下运行,不会报错!
针对上面的加密错误,我不花了一个小时,没有解决思路,麻烦大虾指点下!谢谢!

解决方案 »

  1.   

    source.sql的内容方便贴出来看吗?
      

  2.   

    未加密前的包在pl/sql里运行创建下,看看有没有错误。
    若无错误,则创建后再wrap加密该包。
      

  3.   

    还是包相同的错误!
    source.sql内容:create or replace package p_encrypt_decrypt
    is
      ikey varchar2(8):='paddy123'; 
      function gen_raw_key(ikey in varchar2) return raw;
      function decrypt_3key_mode(ivalue in raw,imode in pls_integer) return number;
      function encrypt_3key_mode(ivalue in varchar2,imode in pls_integer) return raw;
    end;
    /
    create or replace package body p_encrypt_decrypt
    is  function gen_raw_key(ikey in varchar2)
      return raw
      as
        rawkey raw(720):='';
      begin
           for i in 1..length(ikey) loop
              rawkey:=rawkey||hextoraw(to_char(ascii(substr(ikey,i,1))));
           end loop;
      return rawkey;
    end;
      function decrypt_3key_mode(ivalue in raw,imode in pls_integer)
      return number
      as
        v_decryptedraw varchar2(4000);
        v_decrypted number(20,5);
        rawkey raw(720):='';
      begin
           rawkey:=gen_raw_key(ikey);
           v_decryptedraw:=dbms_obfuscation_toolkit.des3decrypt(utl_raw.cast_to_varchar2(ivalue),
           key_string=>rawkey,which=>imode);
           v_decrypted:=to_number(trim(v_decryptedraw)); 
           return v_decrypted;
      end;  function encrypt_3key_mode(ivalue in varchar2,imode in pls_integer)
      return raw
      is
        v_encrypted varchar2(4000);
        v_encryptedraw raw(2048);
        rawkey raw(720):='';
        v_Tmp varchar2(32):=rpad(ivalue,32,' ');
      begin
           rawkey:=gen_raw_key(ikey);
           v_encrypted:=dbms_obfuscation_toolkit.des3encrypt(v_Tmp,key_string=>rawkey,which=>imode);
           v_encryptedraw:=utl_raw.cast_to_raw(v_encrypted);
           return v_encryptedraw;
      end;
    end;
    /
      

  4.   

    从错误码来看,提示标识符太长,ORACLE标识符限制为最大30个字符
    是否是加密后的标识符太长也会出错,
    楼主可尝试把函数、过程、包名、变更名所涉及的标识符命名短一些
      

  5.   

    我改变了标识符的长度
    虽然不会报标识符长度的错误,但是还是会报后面两条错误!
    即:29/2    PLS-00103: 出现符号 "AJ2UKCXFT" 
    29/56    PLS-00103: 出现符号 "="在需要下列之一时:  . ( , * @ % & -    + / at mod remainder rem <an identifier>    <a double-quoted delimited-identifier> <an exponent (**)> as    from into || bulk  
      

  6.   

    我把source.sql中的“/”去掉
    问题剩下最后一个错误了SQL> @e:\p_encrypt_decrypt.sqlWarning: Package created with compilation errorsSQL> show error
    Errors for PACKAGE ERP.P_ENCRYPT_DECRYPT:LINE/COL ERROR
    -------- ----------------------------
    9/1      PLS-00103: 出现符号 "CREATE"SQL> 
      

  7.   

    SQL> @d:\source.sql程序包体已创建。SQL> show error
    没有错误。
    SQL> host wrap iname=d:\source.sql oname=d:\p_encrypt_decrypt.sqlPL/SQL Wrapper: Release 10.2.0.1.0- Production on 星期五 1月  29 12:53:31 2010Copyright (c) 1993, 2004, Oracle.  All rights reserved.Processing d:\source.sql to d:\p_encrypt_decrypt.sqlSQL> @d:\p_encrypt_decrypt.sql程序包体已创建。SQL> show error
    没有错误。
    SQL>
      

  8.   

    所瑞,上面忘记复制包头部分。
    我把你source.sql内容完整保存下来,又测试了一遍,依然没问题!SQL> @d:\source.sql程序包已创建。
    程序包体已创建。SQL> show error
    没有错误。
    SQL> host wrap iname=d:\source.sql oname=d:\p_encrypt_decrypt.sqlPL/SQL Wrapper: Release 10.2.0.1.0- Production on 星期五 1月  29 13:00:07 2010Copyright (c) 1993, 2004, Oracle.  All rights reserved.Processing d:\source.sql to d:\p_encrypt_decrypt.sqlSQL> @d:\p_encrypt_decrypt.sql程序包已创建。
    程序包体已创建。SQL> show error
    没有错误。
    SQL>
      

  9.   

    PL/SQL Wrapper: Release 10.2.0.1.0你的是什么版本?
      

  10.   


    难道?莫灰?或许……传说中的,RPWT。开个小玩,勿怒。你再仔细检查原source.sql里是否有隐藏的特殊字符,然后把运行@source.sql的详细错误贴出来。我就不信邪了!
      

  11.   

    source.sql内容和3楼贴出来的一样保存在e盘下PL/SQL developer中按照你的执行一样:
    SQL> @e:\source.sql;Package createdPackage body created
    SQL> host wrap iname=e:\source.sql oname=e:\p_encrypt_decrypt.sql
    SQL> @e:\p_encrypt_decrypt.sql;Package createdWarning: Package body created with compilation errorsSQL> show error
    Errors for PACKAGE BODY ERP.P_ENCRYPT_DECRYPT:LINE/COL ERROR
    -------- -----------------------------------------------------------------------
    29/8     PLS-00114: 标识符 'SOZFVSJOJTKQIU25X3JYSVCUY3W6RW' 太长
    29/2     PLS-00103: 出现符号 "W"
    29/56    PLS-00103: 出现符号 "="在需要下列之一时:   . ( , * @ % & -     + / at mod remainder rem <an identifier>     <a double-quoted delimited-identifier> <an exponent (**)> as     from into || bulk  
      

  12.   

    @e:\source.sql时,并无错误,是吗?host wrap iname=e:\source.sql oname=e:\p_encrypt_decrypt.sql过程中也没错误提示?我的意思是source.sql里会不会有隐藏的特殊字符什么的,导致wrap时ORACLE加密出来的结果不正确。
    你用记事本什么的,打开仔细看看,哪怕有些空白,也可能是不正确的。我曾经不止一次遇到过这样的情况。
      

  13.   


    试试 在 end 后面加上包的名字。。end p_encrypt_decrypt;
      

  14.   

    测了,没问题啊。楼主用editplus保存试试看。create前面不要有空格,/前面也不要有空格,然后在sqlplus里面执行
      

  15.   

    我简直无语了! 你们咋能成功,我就不行呢?我都检查过了的,没有上面问题啊!
    可就是执行的时候报那个错误SQL> @e:\p_encrypt_decrypt.sql;Warning: Package created with compilation errorsWarning: Package body created with compilation errorsSQL> show error
    Errors for PACKAGE BODY ERP.P_ENCRYPT_DECRYPT:LINE/COL ERROR
    -------- ------------------------
    29/4     PLS-00114: 标识符 'XUN2ZNZN4B86NHHSXQ0SVKX91XOZUJ' 太长
    29/2     PLS-00103: 出现符号 "C"
    33/0     PLS-00103: 出现符号 "end-of-file"在需要下列之一时:   . ( ,     * @ % & - + / at mod remainder rem <an identifier>     <a double-quoted delimited-identifier> <an exponent (**)> as     from into || bulk  SQL> 
      

  16.   

    进入sqllus下执行就不会有问题。
    如果在pl/sql developer中打开cmd窗口执行就有这个错误!
      

  17.   

    进入sqllus下执行就不会有问题。
    这是什么原因呢。。
    我也出现这种情况
      

  18.   

    楼主的系统是什么系统? xp sp2还是xp sp3? win2003?