Developpez.com - Oracle
X

Choisissez d'abord la catégorieensuite la rubrique :


Chiffrage et Hachage des Données dans Oracle

Date de publication : le 04 Avril 2005

Par Bouyao
 

Oracle 10g

I. Le Chiffrement de données dans Oracle 9i
I.1. Chiffrement des Données


I. Le Chiffrement de données dans Oracle 9i


I.1. Chiffrement des Données

On va chiffré le mot MOHAMMEDBOUAYOUN avec la clé ABCDEFGHIJKLMNOP
DECLARE
	   chif_val VARCHAR2(200);
BEGIN
	DBMS_OBFUSCATION_TOOLKIT.des3encrypt
		(input_string	=>	'MOHAMMEDBOUAYOUN',
		 key_string		=>	'ABCDEFGHIJKLMNOP',
		 encrypted_string => chif_val
		 );
	DBMS_OUTPUT.put_line('Valeur chiffré = '|| chif_val);
END;


Valeur chiffré = â4u­¿Nc
ä§)^Sóq
Le resultat de la requête n'est pas interessante pour la stocker ou l'imprimer. Alors, on convertis cette valeur en un type de données RAW par le package UTL_RAW puis en Hexadecimal avec la fonction RAWTOHEX.

Ce qui donne :
DECLARE
	   chif_val VARCHAR2(200);
BEGIN
	DBMS_OBFUSCATION_TOOLKIT.des3encrypt
		(input_string	=>	'MOHAMMEDBOUAYOUN',
		 key_string		=>	'ABCDEFGHIJKLMNOP',
		 encrypted_string => chif_val
		 );
	chif_val := RAWTOHEX(UTL_RAW.cast_to_raw(chif_val));
	DBMS_OUTPUT.put_line('Valeur chiffré = '|| chif_val);
END;

Valeur chiffré = E23475AD8A4E630A81E4A7295E53F371
On peut aussi convertir la valeur chiffré de l'Hexadecimal en valeur numérique
chif_val := to_number('E23475AD8A4E630A81E4A7295E53F371','XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');

Valeur chiffré = 300677913275234235803498582057300521841
Dans les exemple precedentes on'a utilisé la fonction DES3ENCRYPT qui est un triple chiffrement DES. On peut utiliser d'autres fonctions.

Pour faciliter les choses, on crée la fonction :
CREATE OR REPLACE FUNCTION get_enc_val (p_in_val IN VARCHAR2, p_key IN VARCHAR2)
       RETURN VARCHAR2
    IS
       l_enc_val   VARCHAR2 (200);
    BEGIN
       l_enc_val :=
       DBMS_OBFUSCATION_TOOLKIT.des3encrypt (input_string      => p_in_val,
                                             key_string        => p_key
                                             );
       l_enc_val := RAWTOHEX (UTL_RAW.cast_to_raw (l_enc_val));
       RETURN l_enc_val;
    END;

DECLARE
        v_enc   VARCHAR2 (200);
     BEGIN
        v_enc := get_enc_val ('MOHAMMEDBOUAYOUN', 'ABCDEFGHIJKLMNOP');
        DBMS_OUTPUT.put_line ('Valeur chiffré= ' || v_enc);
     END;
      /
Le resultat est :
Valeur chiffré = E23475AD8A4E630A81E4A7295E53F371
On modifie la valeur à chiffré MOHAMMEDBOUAYOUN par MOHAMMEDBOUAYOUN1.

En utilsant cette fonction, on a :
DECLARE
        v_enc   VARCHAR2 (200);
     BEGIN
        v_enc := get_enc_val ('MOHAMMEDBOUAYOUN1', 'ABCDEFGHIJKLMNOP');
        DBMS_OUTPUT.put_line ('Encrypted value = ' || v_enc);
     END;
      /
En lancant le script précdent, on a l'erreur suivante :
ORA-28232: invalid input length for obfuscation toolkit
ORA-06512: at "SYS.DBMS_OBFUSCATION_TOOLKIT_FFI", line 0
ORA-06512: at "SYS.DBMS_OBFUSCATION_TOOLKIT", line 216
ORA-06512: at "SYSTEM.GET_ENC_VAL", line 6
ORA-06512: at line 4
On a cette erreur, car l'entrée de la fonction DES3ENCRYPT doit être un multiple de 8 caractères, ce type de chiffrement est connu sous le nom de chiffrement par bloc (block ciphering), pour remidier à ce problème, on écrit une autre fonction qui ajoute des espaces pour que la longeur de l'entrée soit un multiple de 8.
CREATE OR REPLACE FUNCTION get_enc_val (p_in_val IN VARCHAR2, p_key IN VARCHAR2)
       RETURN VARCHAR2
    IS
       l_enc_val   VARCHAR2 (200);
	   l_in_val	   VARCHAR2 (200);
    BEGIN
	   l_in_val := RPAD(p_in_val,(8*ROUND(LENGTH(p_in_val)/8,0)+8));
       l_enc_val :=
          DBMS_OBFUSCATION_TOOLKIT.des3encrypt (input_string      => l_in_val,
                                                key_string        => p_key
                                               );
       l_enc_val := RAWTOHEX (UTL_RAW.cast_to_raw (l_enc_val));
       RETURN l_enc_val;
    END;

DECLARE
        v_enc   VARCHAR2 (200);
     BEGIN
        v_enc := get_enc_val ('MOHAMMEDBOUAYOUN1', 'ABCDEFGHIJKLMNOP');
        DBMS_OUTPUT.put_line ('Valeur chiffré = ' || v_enc);
     END;
      /
Le resultat est :
Valeur chiffré = E23475AD8A4E630A81E4A7295E53F371DC94046D7D5747F8


Valid XHTML 1.1!Valid CSS!

Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.
Contacter le responsable de la rubrique Oracle