web-dev-qa-db-fra.com

Comment appeler la fonction de hachage Oracle MD5?

J'ai ci-dessous le code. J'utilise 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'

Comment puis-je appeler ce code? Puis-je exécuter directement ce code dans sqldeveloper?

8
user755806

Dans Oracle 12c, vous pouvez utiliser la fonction STANDARD_HASH . Il ne nécessite aucun privilège supplémentaire.

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

Dbms_obfuscation_toolkit est obsolète (voir la note ici ). Vous pouvez utiliser DBMS_CRYPTO directement:

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

Sortie:

ACBD18DB4CC2F85CEDEF654FCCC4A4D8

Ajoutez un appel de fonction inférieur si nécessaire. Plus sur DBMS_CRYPTO .

26
tbone

Je ferais:

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

sortie:

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

@ user755806 Je ne crois pas que votre question ait reçu de réponse. J'ai pris votre code, mais j'ai utilisé l'exemple de chaîne 'foo', ajouté une fonction inférieure et trouvé la longueur du hachage renvoyée. Dans sqlplus ou le client de base de données Java pour développeurs SQL de Oracle, vous pouvez l'utiliser pour appeler le md5sum d'une valeur. Les formats de colonne nettoient la présentation.

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;

Le jeu de résultats

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

est la même valeur renvoyée par une commande Linux md5sum.

echo -n foo | md5sum
acbd18db4cc2f85cedef654fccc4a4d8  -
  1. Oui, vous pouvez appeler ou exécuter l'instruction SQL directement dans le développeur sqlplus ou sql. J'ai testé la déclaration SQL dans les deux clients contre 11g.
  2. Vous pouvez utiliser n'importe quel langage de programmation C, C #, Java ou autre pouvant envoyer une instruction à la base de données. C'est la base de données à l'autre bout de l'appel qui doit être capable de comprendre l'instruction SQL. Dans le cas de 11 g, le code fonctionnera.
  3. @tbone fournit un excellent avertissement sur la désapprobation de dbms_obfuscation_toolkit. Cependant, cela ne signifie pas que votre code est inutilisable en 12c. Cela fonctionnera, mais vous voudrez éventuellement basculer vers le paquet dbms_crypto. dbms_crypto n'est pas disponible dans ma version de 11g.
2
Greg

Pour calculer le hachage MD5 du champ de contenu CLOB avec le codage souhaité sans recoder implicitement le contenu en AL32UTF8, j'ai utilisé ce code:

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