IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Problème utilisation DBMS_CRYPTO


Sujet :

PL/SQL Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2013
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 17
    Points : 6
    Points
    6
    Par défaut Problème utilisation DBMS_CRYPTO
    Bonjour,

    On vient de m'accorder les droits d'accès au package DBMS_CRYPTO, mais malgré les différents posts du forum je rencontre des difficultés.
    Je précise que je suis débutant dans le domaine Oracle /SQL

    Je cherche à crypter plusieurs colonnes d'une table existante, que je pourrais par la suite suite décrypter selon les besoins.

    Le code ci-dessous ne m'a permis que de transformer les données en (null)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    DECLARE
    raw_key RAW(2000);
    PRE_NOM_ASSURE RAW(30000); -- champ à crypter
    PRE_NOM_ASSURE_ENCRYPTED RAW(30000); -- champ crypté
    
    encryption_type PLS_INTEGER :=  DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5;
    v_counter INTEGER := 0;
    BEGIN
         
        raw_key := DBMS_CRYPTO.Hash (UTL_I18N.STRING_TO_RAW ('password', 'BP7IGE8559Z43'), DBMS_CRYPTO.HASH_MD5);
         
        PRE_NOM_ASSURE := DBMS_CRYPTO.ENCRYPT(UTL_I18N.STRING_TO_RAW(PRE_NOM_ASSURE, 'GO8ISO8859P15'), encryption_type, raw_key);
         
        update AAA_FR.T_TABLE_PRE_TEMP  set PRE_NOM_ASSURE = PRE_NOM_ASSURE_ENCRYPTED;
         
        COMMIT;
    END;
    /

    Je cherche également le bon code pour décrypter par la suite les données.

    Merci beaucoup par avance pour votre aide!

    Salutations

  2. #2
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Je connais rien à la crypto mais plusieurs remarques :

    1) quelle est la version de ta base Oracle?

    2) DBMS_CRYPTO.ENCRYPT a 5 paramètres dans la 12, dont un seul optionnel. Toi tu n'utilises que trois paramètres... Il faut faire une gestion des EXCEPTIONs dans ton programme PL/SQL car je pense qu'il y a peut-être une erreur qui n'est pas interceptée par Oracle (même si cela serait étonnant)

    Extrait de la doc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    DBMS_CRYPTO.ENCRYPT(
       dst IN OUT NOCOPY BLOB,
       src IN            BLOB,
       typ IN            PLS_INTEGER,
       key IN            RAW,
       iv  IN            RAW          DEFAULT NULL);
     
    DBMS_CRYPTO.ENCRYPT(
       dst IN OUT NOCOPY BLOB,
       src IN            CLOB         CHARACTER SET ANY_CS,
       typ IN            PLS_INTEGER,
       key IN            RAW,
       iv  IN            RAW          DEFAULT NULL);
    3) C'est quoi 'BP7IGE8559Z43'? Tu as réussi l'exploit d'être le seul lien sous Google quand on fait une recherche sur ce mot... Idem pour 'GO8ISO8859P15'.
    Le deuxième paramètre de UTL_I18N.STRING_TO_RAW est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dst_charset : "Specifies the destination character set. If dst_charset is NULL, then the database character set is used for CHAR data and the national character set is used for NCHAR data".
    Je pense qu'il faut que tu revois les appels aux procédures PL/SQL, et notamment la valeur des paramètres, car ton ou tes erreurs peuvent venir de là.


    Un lien en français qui pourrait t'aider : http://droe-dba.over-blog.fr/article...-42771236.html
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  3. #3
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Ou simplement une erreur de variable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PRE_NOM_ASSURE := DBMS_CRYPTO.ENCRYPT(UTL_I18N.STRING_TO_RAW(PRE_NOM_ASSURE, 'GO8ISO8859P15'), encryption_type, raw_key);
    UPDATE AAA_FR.T_TABLE_PRE_TEMP set PRE_NOM_ASSURE = PRE_NOM_ASSURE_ENCRYPTED;
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  4. #4
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Si c'est le cas, pourquoi il n'y a pas eu d'erreur?
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  5. #5
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    PRE_NOM_ASSURE_ENCRYPTED est déclaré dans la partie DECLARE sans affectation, donc vaut NULL

    Quand au reste, sur ma base ça passe sans erreur , bien que je n'ai pas les charset indiqués
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM V$NLS_VALID_VALUES WHERE parameter = 'CHARACTERSET'
    Contrairement au CONVERT, le STRING_TO_RAW accepte les charset inconnus, mais renvoie NULL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT UTL_I18N.STRING_TO_RAW ('password', 'BP7IGE8559Z43')
    FROM dual
    NULL
     
    SELECT UTL_I18N.STRING_TO_RAW ('password', 'UTF8')
    FROM dual
    70617373776F7264
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  6. #6
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Et tu as testé sa ligne avec DBMS_CRYPTO.ENCRYPT?
    A mon avis il manque un paramètre dans son test.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  7. #7
    Futur Membre du Club
    Inscrit en
    Décembre 2013
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Merci à tous pour vos réponses,

    Il s'agit la version 12c d'Oracle.

    Si je comprends bien, ma requête est incomplète? J'imagine tout à faut qu'elle soit fausse, n'hésitez pas à la reprendre de 0 s'il le faut , en m'indiquant les étapes ( cela m'aiderait beaucoup)

    Merci encore

  8. #8
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    En fait j'ai exécuté son test sans chercher à comprendre, juste pour voir s'il y avait un erreur Oracle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    DECLARE
    raw_key RAW(2000);
    PRE_NOM_ASSURE RAW(30000) := HEXTORAW('656565'); -- champ à crypter
    PRE_NOM_ASSURE_ENCRYPTED RAW(30000); -- champ crypté
    encryption_type PLS_INTEGER :=  DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5;
    v_counter INTEGER := 0;
    BEGIN
        raw_key := DBMS_CRYPTO.Hash (UTL_I18N.STRING_TO_RAW ('password', 'BP7IGE8559Z43'), DBMS_CRYPTO.HASH_MD5);
        PRE_NOM_ASSURE_ENCRYPTED := DBMS_CRYPTO.ENCRYPT(UTL_I18N.STRING_TO_RAW(PRE_NOM_ASSURE, 'GO8ISO8859P15'), encryption_type, raw_key);
    	dbms_output.put_line('PRE_NOM_ASSURE_ENCRYPTED:'||PRE_NOM_ASSURE_ENCRYPTED);
        PRE_NOM_ASSURE_ENCRYPTED := DBMS_CRYPTO.ENCRYPT(UTL_I18N.STRING_TO_RAW(PRE_NOM_ASSURE, 'UTF8'), encryption_type, raw_key);
    	dbms_output.put_line('PRE_NOM_ASSURE_ENCRYPTED UTF8:'||PRE_NOM_ASSURE_ENCRYPTED);
    END;
    Sort en erreur
    ORA-28239: no key provided
    ORA-06512: at "SYS.DBMS_CRYPTO_FFI", line 3
    au second DBMS_CRYPTO.ENCRYP (j'ai l'output précedent PRE_NOM_ASSURE_ENCRYPTED: )

    La fonction a bien 4 paramètres dont le dernier est optionnel, donc c'est correct, c'est juste que si SRC est NULL il retourne NULL sans chercher à vérifier si KEY est NOT NULL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    FUNCTION  ENCRYPT (src IN  RAW,
                       typ IN PLS_INTEGER,
                       KEY IN RAW,
                       iv  IN RAW DEFAULT NULL)
      RETURN RAW;

    Avec des données (champ à crypter et raw_key correct), voici ce que ça donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    DECLARE
    raw_key RAW(2000);
    PRE_NOM_ASSURE RAW(30000) := HEXTORAW('656565'); -- champ à crypter
    PRE_NOM_ASSURE_ENCRYPTED RAW(30000); -- champ crypté
    encryption_type PLS_INTEGER :=  DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5;
    v_counter INTEGER := 0;
    BEGIN
        raw_key := DBMS_CRYPTO.Hash (UTL_I18N.STRING_TO_RAW ('password', 'UTF8'), DBMS_CRYPTO.HASH_MD5);
        PRE_NOM_ASSURE_ENCRYPTED := DBMS_CRYPTO.ENCRYPT(UTL_I18N.STRING_TO_RAW(PRE_NOM_ASSURE, 'GO8ISO8859P15'), encryption_type, raw_key);
    	dbms_output.put_line('PRE_NOM_ASSURE_ENCRYPTED:'||PRE_NOM_ASSURE_ENCRYPTED);
        PRE_NOM_ASSURE_ENCRYPTED := DBMS_CRYPTO.ENCRYPT(UTL_I18N.STRING_TO_RAW(PRE_NOM_ASSURE, 'UTF8'), encryption_type, raw_key);
    	dbms_output.put_line('PRE_NOM_ASSURE_ENCRYPTED UTF8:'||PRE_NOM_ASSURE_ENCRYPTED);
    END;
     
     
    PRE_NOM_ASSURE_ENCRYPTED:
    PRE_NOM_ASSURE_ENCRYPTED UTF8:9E0A55A8D12125667B54816054B42E2E
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  9. #9
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Steppingstone Voir le message
    Bonjour,
    Si je comprends bien, ma requête est incomplète? J'imagine tout à faut qu'elle soit fausse, n'hésitez pas à la reprendre de 0 s'il le faut , en m'indiquant les étapes ( cela m'aiderait beaucoup)
    Je pense que tu peux faire beaucoup plus simple, mais ne connaissant pas tout le contexte je vais peut être prendre des raccourcis
    1/ Utiliser utl_raw.cast_to_raw pour transformer un VARCHAR2 en RAW

    raw_key := DBMS_CRYPTO.Hash (utl_raw.cast_to_raw('password'), DBMS_CRYPTO.HASH_MD5);

    tu peux très bien le lancer une fois, récupérer le résultat et le définir dans le DECLARE
    raw_key RAW(32) := HEXTORAW('5F4DCC3B5AA765D61D8327DEB882CF99');


    Pour crypter 'Developpez.com' avec la clé DBMS_CRYPTO.Hash (utl_raw.cast_to_raw('password'), DBMS_CRYPTO.HASH_MD5)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DECLARE
      raw_key RAW(32) := HEXTORAW('5F4DCC3B5AA765D61D8327DEB882CF99');
      pre_nom_assure VARCHAR2(100) := 'Developpez.com'; -- champ à crypter
      pre_nom_assure_encrypted RAW(2000); -- champ crypté
      encryption_type PLS_INTEGER :=  DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5;
    BEGIN
       pre_nom_assure_encrypted := DBMS_CRYPTO.ENCRYPT(utl_raw.cast_to_raw(pre_nom_assure), encryption_type, raw_key);
       dbms_output.put_line('pre_nom_assure_encrypted : '|| pre_nom_assure_encrypted);
    END;

    Après j'espère que ton update était juste là pour la forme (pas de condition where)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update AAA_FR.T_TABLE_PRE_TEMP  set PRE_NOM_ASSURE = PRE_NOM_ASSURE_ENCRYPTED;
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  10. #10
    Futur Membre du Club
    Inscrit en
    Décembre 2013
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Bonjour McM et merci, je vais tester cela et vous tiendrai informé.
    Pour information l'update visait à mettre à jour la colonne entière PRE_NOM_ASSURE, c'est l'objectif du cryptage que je souhaite mettre en place.

Discussions similaires

  1. Problème utilisation DLL
    Par Tub-95 dans le forum MFC
    Réponses: 4
    Dernier message: 02/11/2005, 12h00
  2. [Tomcat][Spring] Problème utilisation mémoire
    Par Wutintin dans le forum Hibernate
    Réponses: 12
    Dernier message: 08/09/2005, 14h57
  3. [JSTL] [EL] Problème utilisation <c:out>
    Par XavierL dans le forum Taglibs
    Réponses: 7
    Dernier message: 14/08/2005, 20h12
  4. (Problème) Utilisation de l'API mySQL [Delphi 2005 Perso]
    Par will-scs dans le forum Bases de données
    Réponses: 2
    Dernier message: 08/08/2005, 18h26
  5. [JAR]Problème utilisation manifest et jar
    Par doudine dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 07/01/2005, 10h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo