Chiffrage et Hachage des Données dans OracleDate 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 |
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.
|