Mardi 12 janvier 2010 2 12 /01 /Jan /2010 00:35


Encrypter vos données avec DBMS_CRYPTO.


DBMS_CRYPTO est un package Oracle 10g qui permet l’encryptions des données. Anciennement nommé DBMS_OBFUSCATION_TOOLKIT, ce nouveau package possède des algorithmes de cryptage et des fonctions de chiffrement plus puissants.

 

Je vais vous le présenter en action dans un package fonctionnel testé sur un Oracle 10gR2 en environnement Windows.

Nous allons utiliser l’algorithme de cryptage AES128 (Advanced Encryptions Standard 128 bits) + fonction de chiffrement par bloc (CHAIN_CBC) + fonction de padding (PAD_PKCS5).

 

 

1 – dbmsobtk.sql

 

Tout d’abord il vous faut exécuter le dbmsobtk.sql en user SYS qui se trouve dans ORACLE_HOME/rdbms/admin/  (création des Library,package,synonym)

 

SQL> @c:\oracle\product\10.2.0\db_1\rdbms\admin\dbmsobtk.sql;

 

 

2 – GRANT DBMS_CRYPTO

 

Ensuite donner les droits d’exécutions et debug sur DBMS_CRYPTO.

 

SQL> GRANT EXECUTE, DEBUG ON DBMS_CRYPTO to PUBLIC;

 

 

3 – Création d’un fichier dans un répertoire Windows

 

Nous allons créer un fichier à l’aide de Notepad à la racine de C:\ , nous allons le nommer MA_CLE.DAT et y placer un texte (la clé en fait) sur 16 caractères.

 

Ex : cle128bitsoracle   -> (16 caractères)

 

Vous pouvez aussi stocker votre clé dans une table Oracle, mais dans cet exemple nous choisirons de mettre la clé en dehors de la BDD (un des avantages de cet exemple c’est que les données cryptées dans un export Full ou User sera illisible car la clé n’est pas exportée avec la base et la fonction de décryptage ou cryptage plantera simplement si les données sont chargées sur un autre environnement et c’est très bien d’ailleurs c’est le but recherché !!!).

 

 

4 – Création d’un DIRECTORY Oracle

 

Nous allons créer un DIRECTORY se nommant ’FICHIER_KEY’ dans oracle afin que nos fonctions puissent lire la clé dans le fichier C:\MA_CLE.DAT et ensuite attribution des droits de lecture. Connectez-vous dans SQLPLUS, TOAD ou SQL DEVELOPPER avec votre User BDD.

 

SQL> CREATE OR REPLACE DIRECTORY FICHIER_KEY as ’c:\’;

SQL> GRANT READ on DIRECTORY FICHIER_KEY TO Public ;

 

 

5 – Création de notre Package contenant nos deux fonctions

 

Connectez-vous avec votre User BDD. Remplacez USERBDD par votre user (Schéma).

Puis exécutez ces deux scripts. Les deux fonctions ont comme paramètre en entrée la chaine à Crypter ou la chaine à Décrypter.

 

CREATE OR REPLACE PACKAGE USERBDD.PACK_CRYPTAGE AS

 

  FUNCTION F_ENCRYPT(mdp IN varchar2) RETURN VARCHAR2;

  FUNCTION F_DECRYPT(mdp IN varchar2) RETURN VARCHAR2;

 

END PACK_CRYPTAGE;

/

CREATE OR REPLACE PACKAGE BODY USERBDD.PACK_CRYPTAGE AS

 

FUNCTION F_ENCRYPT(mdp IN varchar2) RETURN VARCHAR2 is

v_key               VARCHAR2(16);

v_fichier           VARCHAR2(10) := 'MA_CLE.DAT';

v_file UTL_FILE.FILE_TYPE;

l_enc_key           RAW(2000);

l_enc               RAW(2000);

l_mod pls_integer := DBMS_CRYPTO.ENCRYPT_AES128 +

 DBMS_CRYPTO.chain_cbc +

                     DBMS_CRYPTO.pad_pkcs5;

   

begin   

   v_file := utl_file.fopen('FICHIER_KEY', v_fichier,'r',128);

   utl_file.get_line(v_file,v_key,2000);

   utl_file.fclose(v_file);

       

     begin

        l_enc_key := utl_i18n.string_to_raw (v_key, 'AL32UTF8');

        l_enc := DBMS_CRYPTO.encrypt (utl_i18n.string_to_raw (mdp, 'AL32UTF8'),

                                      l_mod,

                                      l_enc_key);

     end;

     return RAWTOHEX(l_enc);

end;   

 

 

FUNCTION F_DECRYPT(mdp IN varchar2) RETURN VARCHAR2 is

v_key               VARCHAR2(16);

v_fichier           VARCHAR2(10) := 'MA_CLE.DAT';

v_file UTL_FILE.FILE_TYPE;

l_enc_key           RAW(2000);

l_dec               RAW(2000);

l_in_val            RAW(2000)      := HEXTORAW (mdp);

l_mod pls_integer := DBMS_CRYPTO.ENCRYPT_AES128 +

 DBMS_CRYPTO.chain_cbc +

 DBMS_CRYPTO.pad_pkcs5;

   

begin   

   v_file := utl_file.fopen('FICHIER_KEY', v_fichier,'r',128);

   utl_file.get_line(v_file,v_key,2000);

   utl_file.fclose(v_file);

           

     begin

        l_enc_key := utl_i18n.string_to_raw (v_key, 'AL32UTF8');

        l_dec := DBMS_CRYPTO.decrypt (l_in_val,

                                      l_mod,

                                      l_enc_key);

     end;

     return utl_i18n.raw_to_char(l_dec);

end;   

END;

/

 

 

6 – Autoriser l’exécution du Package TO Public (changer USERBDD par votre USER)

 

SQL> GRANT EXECUTE ON USERBDD.PACK_CRYPTAGE TO PUBLIC;

 

 

7 – On test les 2 fonctions?

 

On encrypte...

 

SQL> select pack_cryptage.f_encrypt('http://droe-dba.over-blog.fr/') from dual;

 

 

Normalement si vous avez mis la clé (cle128bitsoracle) de l’exemple, ça vous donne ceci :

3C8F646CE5FC96F6D5932C1E64C046E0C5BE75EF425A6455E77C17B16F41257B

 



 

On décrypte...

 

SQL> select pack_cryptage.f_decrypt('3C8F646CE5FC96F6D5932C1E64C046E0C5BE75EF425A6455E77C17B16F41257B') from dual;

 

Ça vous donne ceci :

http://droe-dba.over-blog.fr/

 

 

7 – On sécurise encore??

 

Vous me direz oui mais si un utilisateur averti tombe sur ce Package avec les deux fonctions, il peut facilement voir le chemin du fichier sur C:\, voir quel algorithme nous avons choisi etc etc...

Voilà une solution Oracle avec l’utilitaire WRAP utilisable en ligne de commande.

Placez vous dans le répertoire ou vous avez sauvegardé votre package et exécutez cette commande. (INAME= nom du package à compiler, ONAME= nom du package compilé)

 

C:\wrap iname=PACK_CRYPTAGE.pkb oname=PACK_CRYPTAGEW.pkb

 

 

Puis sous TOAD, SQLPLUS, ou SQL DEVELOPPER, ouvrez le nouveau package compilé et RECOMPILER le, maintenant c'est illisible!!

 

 

Par Daniel R. - Publié dans : SECURITE - USER
Ecrire un commentaire - Voir les 0 commentaires
Retour à l'accueil

Rechercher Articles Oracle SQL sur ce Site.

Loading

À lire aussi…

Download PDF Oracle

Rechercher sur le site

Oracle 10G - DBA -

Syndication

  • Flux RSS des articles
Contact - C.G.U. - Rémunération en droits d'auteur - Signaler un abus - Articles les plus commentés