加密的数据在导出,再导入后,大多无法解密了,有谁能够帮助?
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的问题,看看是不是需要设置字符集什么的