如何正确调用DBMS_OBFUSCATION_TOOLKIT.DESEncrypt?(如果可能,不使用PL/SQL )
select DBMS_OBFUSCATION_TOOLKIT.DESEncrypt('x','y') from dual;无法工作,因为DESEncrypt过载了:
ORA-06553: PLS-307: Too many declarations of "DESENCRYPT" match this call
06553. 00000 - "PLS-%s: %s"
*Cause:
*Action:有没有办法选择DESENCRYPT的一个实现(可能是VARCHAR2变体)来避免这个错误?
发布于 2011-05-03 21:13:06
在这里,只需通过提供参数名称让它知道要使用哪个重载!
select DBMS_OBFUSCATION_TOOLKIT.DesEncrypt(INPUT_STRING=>'11112abc',KEY_STRING=>'4578ccde')
from dual ;返回
M5��w5Z
注意,您的密钥至少需要8个字节:
ORA- 28234 :密钥长度太短ORA-06512:在"SYS.DBMS_OBFUSCATION_TOOLKIT_FFI",第21行ORA-06512:在"SYS.DBMS_OBFUSCATION_TOOLKIT",第126 28234行。00000 -“密钥长度太短”*原因:指定的密钥对于算法来说太短。DES需要至少8个字节的密钥。三重DES在双密钥模式下需要至少16字节的密钥,在三密钥模式下至少需要24字节的密钥。*操作:指定一个更长的密钥。
您可以尝试使用包装器函数(如tony建议的那样)。
create or replace
function DesEncrypt(pinputString IN VARCHAR2 , pKeyString in VARCHAR2) RETURN varchar2
IS
BEGIN
return DBMS_OBFUSCATION_TOOLKIT.DesEncrypt(INPUT_STRING=>INPUTSTRING,KEY_STRING=>KEYSTRING);
END DesEncrypt;
/
select DesEncrypt('11112abc' , '4578ccde') from dual ;由于您使用的是10g,因此可能需要使用DBMS_CRYPTO包http://www.stanford.edu/dept/itss/docs/oracle/10g/network.101/b10773/apdvncrp.htm
发布于 2011-05-03 21:13:38
在Oracle 11G中,您可以使用如下命名表示法:
select DBMS_OBFUSCATION_TOOLKIT.DESEncrypt(input_string=>'x',key_string=>'y')
from dual;我认为在早期版本的Oracle中不可能明确地调用这些函数,除非创建一个包装函数并调用它。
发布于 2011-05-03 22:31:21
这是一个使用旧dbms_obfuscation_toolkit的加密/解密:
create or replace function crypt(p_str in varchar2, p_key in varchar2) return varchar2
as
l_data varchar2(255);
begin
l_data := rpad(p_str, (trunc(length(p_str)/8)+1)*8,chr(0));
dbms_obfuscation_toolkit.DESEncrypt
(input_string=>l_data,
key_string=>p_key,
encrypted_string=>l_data);
return l_data;
end;对于解密:
create or replace function decrypt(p_str in varchar2, p_key in varchar2) return varchar2
as
l_data varchar2(255);
begin
dbms_obfuscation_tookit.DESDecrypt
(input_string=>p_str,
key_string=>p_key,
decrypted_string=>l_data);
return rtrim(l_data,chr(0));
end;和用法:
declare
l_data varchar2(100);
l_key varchar2(100);
l_encrypted varchar2(100);
l_decrypted varchar2(100);
begin
l_data := 'This is secret!!!';
l_key := 'My secret key';
dbms_output.put_line(l_data);
l_encrypted := crypt(l_data, l_key);
dbms_output.put_line(l_encrypted);
l_decrypted := decrypt(l_encrypted, l_key);
dbms_output.put_line(l_decrypted);
end;https://stackoverflow.com/questions/5869881
复制相似问题