it-roy-ru.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 устарела (см. Примечание здесь ). Вы можете использовать DBMS_CRYPTO напрямую:

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

Результат:

ACBD18DB4CC2F85CEDEF654FCCC4A4D8

Добавьте более низкий вызов функции, если это необходимо. Подробнее о DBMS_CRYPTO .

26
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. Да, вы можете вызвать или выполнить инструкцию sql непосредственно в sqlplus или sql developer. Я проверил заявление sql в обоих клиентах против 11g.
  2. Вы можете использовать любой C, C #, Java или другой язык программирования, который может отправлять оператор в базу данных. Это база данных на другом конце вызова, которая должна понимать оператор SQL. В случае 11 г, код будет работать.
  3. @tbone предоставляет отличное предупреждение об устаревании dbms_obfuscation_toolkit. Однако это не означает, что ваш код непригоден для использования в 12c. Это будет работать, но вы в конечном итоге захотите переключиться на пакет dbms_crypto. dbms_crypto не доступен в моей версии 11g.
2
Greg

Чтобы вычислить MD5-хэш поля содержимого CLOB с моей желаемой кодировкой без неявной записи содержимого в AL32UTF8, я использовал этот код:

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