web-dev-qa-db-ja.com

Oracle MD5ハッシュ関数を呼び出す方法

以下のコードがあります。 Oracle 11gを使用しています。

SELECT DBMS_OBFUSCATION_TOOLKIT.md5 (input => UTL_RAW.cast_to_raw(
  FIRST_NAME
  ||LAST_NAME
  )) md5_key ,
  FIRST_NAME ,
  LAST_NAME
FROM C_NAME_TAB
WHERE PKEY='1234'

このコードを呼び出すにはどうすればよいですか?このコードをsqldeveloperで直接実行できますか?

8
user755806

Oracle 12cでは、関数 STANDARD_HASH を使用できます。追加の特権は必要ありません。

select standard_hash('foo', 'MD5') from dual;

Dbms_obfuscation_toolkitは非推奨です(注 here を参照)。 DBMS_CRYPTOを直接使用できます。

select rawtohex(
    DBMS_CRYPTO.Hash (
        UTL_I18N.STRING_TO_RAW ('foo', 'AL32UTF8'),
        2)
    ) from dual;

出力:

ACBD18DB4CC2F85CEDEF654FCCC4A4D8

必要に応じて、より低い関数呼び出しを追加します。 DBMS_CRYPTO の詳細。

27
tbone

私はやります:

select DBMS_CRYPTO.HASH(rawtohex('foo') ,2) from dual;

出力:

DBMS_CRYPTO.HASH(RAWTOHEX('FOO'),2)
--------------------------------------------------------------------------------
ACBD18DB4CC2F85CEDEF654FCCC4A4D8
3
James Ding

@ user755806あなたの質問に答えられたとは思わない。私はあなたのコードを取りましたが、「foo」のサンプル文字列を使用し、より低い関数を追加し、返されたハッシュの長さも見つけました。 sqlplusまたはOracleのsql developerでは、Javaデータベースクライアントを使用して、値のmd5sumを呼び出すことができます。列フォーマットはプレゼンテーションをクリーンアップします。

column hash_key format a34;
column hash_key_len format 999999;
select dbms_obfuscation_toolkit.md5(
          input => UTL_RAW.cast_to_raw('foo')) as hash_key,
       length(dbms_obfuscation_toolkit.md5(
          input => UTL_RAW.cast_to_raw('foo'))) as hash_key_len
 from dual;

結果セット

HASH_KEY                           HASH_KEY_LEN
---------------------------------- ------------
acbd18db4cc2f85cedef654fccc4a4d8             32

linux md5sumコマンドから返される値と同じです。

echo -n foo | md5sum
acbd18db4cc2f85cedef654fccc4a4d8  -
  1. はい、sqlplusまたはsql developerで直接sqlステートメントを呼び出すか実行できます。 11gに対して両方のクライアントでsqlステートメントをテストしました。
  2. 任意のC、C#、Java、またはデータベースにステートメントを送信できる他のプログラミング言語を使用できます。これは、呼び出しの反対側にあるデータベースであり、 sqlステートメント:11 gの場合、コードは機能します。
  3. @tboneは、dbms_obfuscation_toolkitの非推奨に関する優れた警告を提供します。ただし、それはあなたのコードが12cで使用できないという意味ではありません。動作しますが、最終的にdbms_cryptoパッケージに切り替える必要があります。 dbms_cryptoは、私のバージョンの11gでは使用できません。
2
Greg

コンテンツを暗黙的にAL32UTF8に再コーディングせずに、希望するエンコーディングでCLOBコンテンツフィールドのMD5ハッシュを計算するには、次のコードを使用しました。

create or replace function clob2blob(AClob CLOB) return BLOB is
  Result BLOB;
  o1 integer;
  o2 integer;
  c integer;
  w integer;
begin
  o1 := 1;
  o2 := 1;
  c := 0;
  w := 0;
  DBMS_LOB.CreateTemporary(Result, true);
  DBMS_LOB.ConvertToBlob(Result, AClob, length(AClob), o1, o2, 0, c, w);
  return(Result);
end clob2blob;
/

update my_table t set t.hash = (rawtohex(DBMS_CRYPTO.Hash(clob2blob(t.content),2)));
0
Nashev