3

正しく呼び出す方法は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の1つの実装(おそらくVARCHAR2バリアント)を選択する方法はありますか?

4

3 に答える 3

9

Oracle 11Gでは、次のような名前付き表記を使用できます。

select DBMS_OBFUSCATION_TOOLKIT.DESEncrypt(input_string=>'x',key_string=>'y')
from dual;

以前のバージョンのOracleでは、ラッパー関数を作成して代わりに呼び出すことを除いて、これらの関数を明確に呼び出すことはできないと思います。

于 2011-05-03T13:13:38.217 に答える
7

ここで、パラメータ名を指定して、使用するオーバーロードを知らせてください。

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バイトのキーが必要です。Triple DESには、2キーモードで16バイト以上、3キーモードで24バイト以上のキーが必要です。*アクション:より長いキーを指定してください。


あなたはいつでもラッパー関数でそれを試すことができます(トニーが提案したように)

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-03T13:13:05.853 に答える
2

古い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;
于 2011-05-03T14:31:21.477 に答える