2012-05-31 3 views
1
DECLARE 
    l_string NVARCHAR2(600) := '123456'; 
    checksum NVARCHAR2(600); 

BEGIN 

    DBMS_OUTPUT.DISABLE; 
    DBMS_OUTPUT.ENABLE(1000000); 

    DBMS_OBFUSCATION_TOOLKIT.md5 (input_string => l_string, checksum_string => checksum); 

    DBMS_OUTPUT.PUT_LINE(RAWTONHEX(utl_raw.cast_to_raw(checksum))); 

END; 

Valeur attendue: e10adc3949ba59abbe56e057f20f883eNVARCHAR2 MD5 Hash dans Oracle DBMS_OBFUSCATION_TOOLKIT.MD5

Mais il retourne: FFFD00390049FFFD0059FFFDFFFD0056FFFD000FFFFD003E

Remarque Je veux maintenir NVARCHAR2 type de données. La valeur de la variable checksum est stockée dans une colonne de type nvarchar2.

Je suis conscient que md5 accepte et retourne des données dans varchar2. Mais si quelqu'un peut m'aider à comprendre cela en utilisant le type de données nvarchar2, ce serait génial.

Le NLS_CHARACTERSET = AL32UTF8

+0

Ce code ne s'exécute pas lorsque vous obtenez 'ORA-28231: aucune donnée transmise à obfuscation toolkit'. Cela a du sens car vous n'avez défini 'l_string' à rien. Alors, où avez-vous obtenu ces checksums attendus et réels? Sur une note sans rapport, pourquoi le 'commit'? –

+0

Désolé, la valeur de l_string = 123456. Accepte pas besoin de validation. – user357086

+0

S'il vous plaît mettre à jour le code pour montrer le code exact que vous avez couru, y compris le 123456. –

Répondre

0

suivante doit fonctionner via DBMS_CRYPTO en utilisant hachage()

declare 
    l_src nvarchar2(100) := '123456'; 
    l_raw_hash raw(100); 
begin 
    l_raw_hash := dbms_crypto.hash(to_clob(l_src), dbms_crypto.HASH_MD5); 
    dbms_output.put_line(l_raw_hash); 
end; 

Résultat: E10ADC3949BA59ABBE56E057F20F883E

l_raw_hash sera au format brut. Vous pouvez utiliser UTL_RAW pour le convertir en un autre type de données. Assurez-vous simplement que votre écran affiche le bon jeu de caractères ou que la chose semble intéressante.