日期:2014-05-17  浏览次数:20989 次

加密的数据在导出,再导入后,大多无法解密了,有谁能够帮助?
ORACLE 10G数据库,对数据库中某表的地址(varchar2   1024)与电话(varchar2   64)进行加密,用的加密函数如下:
create   or   replace   function   encrypt_data(p_text   varchar2,   p_key   varchar2)   return   varchar2   is
v_text   varchar2(4000);
v_enc   varchar2(4000);
begin
if   p_text   is   null   then
return   null;
else
v_text   :=   rpad(p_text,   (trunc(lengthb(p_text)/8)+1)*8,   chr(0));

sys.dbms_obfuscation_toolkit.desencrypt(
input_string   =>   v_text,
key_string   =>   p_key,
encrypted_string=> v_enc);

return   v_enc;
end   if;
end;
/

create   or   replace   function   decrypt_data(p_text   varchar2,   p_key   varchar2)   return   varchar2   is
v_text   varchar2(4000);
begin
if   p_text   is   null   then
return   null;
else
sys.dbms_obfuscation_toolkit.desdecrypt(
input_string   =>   p_text,
key_string   =>   p_key,
decrypted_string=>   v_text);

return   rtrim(v_text,chr(0));
end   if;
end;
/

正常加密后,解密是可以用的。但在把数据库导出,并且在另一台数据库10G服务器导入后,绝大多数数据不能解密。报:

ORA-28232:   obfuscation   工具箱的输入长度无效
ORA-06512:   在   "SYS.DBMS_OBFUSCATION_TOOLKIT_FFI ",   line   40
ORA-06512:   在   "SYS.DBMS_OBFUSCATION_TOOLKIT ",   line   153
ORA-06512:   在   "WEBSITE.DECRYPT_DATA ",   line   7

偶尔有一两个字可以解密。


查看了数据库表中的数据,能够解析的,转换后的值相同,如,
原始数据:
747233   北京市朝阳区光华路7号汉威大厦B802   65612776

加密后的,导出再导入后都为下面值:
747233   g踣 <襢摜糀?   :??苣^腆@=痶櫵??:贵   階1霟pE?监叒!AW


不能够解析的,转换后的值有差别如,原始数据:
747234   北京市朝阳区光华路7号汉威大厦东20层A7   65612480

加密后的(能够解密),
747234   g踣 <襢摜糀?   :??苣鉃呡虑躸   凶窄?梋€U?鞬Rhm嬝?@

导出再导入的(不能解密),
747234   g踣 <襢摜糀?   :??苣鉃呡虑躸   凶窄   梋€U?鞬Rhm嬝?@


错误。请问是何原因?怎样解决呢?


补充:
两个数据库是一样的。导出与导入吗,当然是完全一样的。

问题是,我在加密后,再解密是可以用的。但如果把数据导出(EXP)再导入(IMP)到另外一台数据库服务器上,就不能用了。

上面的代码已经加了,将字符串转换为8的整数倍长度的代码了啊。

是不是ORACLE的导出与导入不支持复杂的符号呢?

------解决方案--------------------
不知道两个数据库的字符级是否一致,先看下
SELECT * FROM SYS.PROPS$ ;
两个数据库的字符级情况。
如果数据库的数据不太多的话,先解密到个临时表,IMP以后在加密,更新原表
------解决方案--------------------
需要一个数据一致性的校验
------解决方案--------------------
应该是emp,imp的问题,看看是不是需要设置字符集什么的