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

DB2 Discussion :

[DB2 Iseries V5R4] Crytage : probleme dans une procedure SQL


Sujet :

DB2

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 97
    Points : 79
    Points
    79
    Par défaut [DB2 Iseries V5R4] Crytage : probleme dans une procedure SQL
    Messieurs

    j'essaie de coder un procédure simple appelé par un trigger cryptant des données insérées.
    Cette procédure me servira a récuperer ma clé de cryptage a partir du hint stocker dans la colonne crypter.
    Mais je n'y arrive pas sans réussir a voir pourquoi.
    Pouvez vous m'aider svp (je perd un temp fous sur ce truc qui doit être evident).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CREATE procedure monschema.GET_PASSWORD (in table char(100), in zone char(100), out encrypt_key char(100), out encrypt_hint char(100))
    LANGUAGE SQL 
    BEGIN
    DECLARE requete CHAR(1000);
    set requete = 'SELECT GETHINT(' || RTRIM(Zone) || ') into encrypt_hint FROM monschema.' || RTRIM(table)  ;
    Prepare s1 from requete ;
    execute s1 ;
    set requete = 'SELECT PY_LB_PARAMETRE into encrypt_key from monschema.matableparametre where PY_NM_PARAMETRE = ' || encrypt_hint || ' with ur ;';
    Prepare s2 from requete ;
    execute s2 ;
    END;
     
    call monschema.GET_PASSWORD('tableavecdonneescryptee', 'colonneacrypter', ?, ?) ;
    je vous joint un exemple pour crypter une de vos colonnes pour tester cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    /* specification de la clé */
    SET ENCRYPTION PASSWORD = 'macledecryptage' WITH HINT='monhintpouraccederamacle' ;
    /* insertion de données avec cryptage directe via l'insert (autre solution, le trigger */
    INSERT INTO monschema.matable VALUES('test', '2008-09-04 00:00:00.000000', 1, ENCRYPT('monpass')); 
    /* Ordre permetant de récupérer le hint pour retrouver la clé utilisé sur une colonne*/
    SELECT GETHINT(macolonnecrypter) FROM monschema.matable with ur ;
    /* Fonction pour decrypter une colonne de maniére directe */
    SELECT DECRYPT_CHAR(macolonnecrypter) FROM monschema.matable  WHERE UM_ID_UTILISATEUR='test' with ur ;
    Pour ceux que ca intéresse le lien qui ma permis d'en arrivé la :

    http://systemi.itpro.fr/Dossiers-par...ryptage.htm#R1

    Merci d'avance

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Sans tester quoique ce soit, quels messages reçois-tu de la part de SQL à l'exécution ?
    Je parle des messages dont le MSGID est SQLnnnn.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 97
    Points : 79
    Points
    79
    Par défaut
    Ci dessous le code d'erreur tel que j'ai envoyer la proc, qui semble signifier qu'il faille un ":" devant ENCRYPT_HINT (ce que je vais faire ensuite pour te donner le message d'erreur une fois ceci fait (cf deuxieme encadré))

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Message : [SQL0104] Elément syntaxique ENCRYPT_HINT n'est pas correct. Eléments possibles : :. Cause . . . . . :   Une erreur de syntaxe a été détectée au niveau de l'élément ENCRYPT_HINT.  ENCRYPT_HINT n'est pas un élément correct.  : est une liste partielle des éléments corrects.  Cette liste suppose que l'instruction est correcte jusqu'à cet élément.  L'erreur peut être située plus haut dans l'instruction, mais la syntaxe de l'instruction apparaît correcte jusqu'à ce point. Que faire . . . :   Effectuez les opérations suivantes, puis renouvelez votre demande : - Vérifiez l'instruction au niveau de l'élément ENCRYPT_HINT. Corrigez-la. Il peut s'agir d'une virgule ou de guillemets manquants, ou de clauses mal ordonnées. - Si l'erreur porte sur <FIN-INSTRUCTION>, corrigez l'instruction SQL qui ne se termine pas sur une clause correcte.
    second message aprés avoir mis le ":" et la je ne comprend plus car cette variable et pourtant bien defini dans la declaration de la procedure.

    de plus le message et le même si j'ajoute "DECLARE encrypt_hint CHAR(100);" ce qui a priori n'est pas necessaire pourtant.

    Je séche.... ????

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Etat SQL : 42618
    Code fournisseur : -312
    Message : [SQL0312] Variable ENCRYPT_HINT non définie ou non utilisable. Cause . . . . . :   La variable ENCRYPT_HINT apparaît dans l'instruction SQL, mais l'une des conditions suivantes s'est produite : - La variable n'est pas déclarée. - Ses attributs sont incorrects pour l'usage indiqué. - La variable hôte figure dans une instruction SQL dynamique, ce qui n'est pas admis. - En REXX, les noms de variables hôte ne peuvent contenir de blancs imbriqués. - Le nom de variable est utilisé dans le corps d'un programme d'une procédure ou d'une fonction SQL mais la variable n'est pas déclarée en tant que variable ou paramètre SQL. Le champ d'application d'une variable SQL est défini par l'instruction composée contenant la déclaration. - La variable est utilisée dans le corps d'un programme d'une procédure ou d'une fonction SQL, mais la variable n'est pas déclarée en tant que variable SQL ou il s'agit d'une variable de transition OLD et celle-ci ne peut pas être modifiée. -- Il s'agit d'une variable de transition d'un déclencheur AFTER pouvant est utilisée dans une instruction où elle peut être modifiée. La modification des variables de transition dans des déclencheurs AFTER n'est pas admise. Que faire . . . :   Effectuez l'une des opérations suivantes, puis renouvelez votre demande : - Vérifiez l'orthographe de ENCRYPT_HINT dans l'instruction SQL. - Vérifiez que cette variable est bien déclarée dans le programme. - Vérifiez que ses attributs sont compatibles avec l'usage qu'il en est fait dans l'instruction. - Dans une instruction dynamique, utilisez des marques de paramètre au lieu de variables. - Supprimez les blancs imbriqués des noms de variables hôte REXX. - Déclarez la variable en tant que variable ou paramètre SQL dans la procédure ou la fonction SQL. - Déclarez la variable en tant que variable ou paramètre SQL, ou indiquez une variable de transition NEW lorsque la variable est modifiée dans un déclencheur SQL. -- Supprimez la variable de transition de l'instruction. Le fait de copier la variable de transition dans une variable locale et d'utiliser celle-ci dans l'instruction est également admis.

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Est-ce que le produit "Cryptographic Access Provider 128-bit for AS/400 product (5722AC3)" est installé sur ta machine ?
    Pour le voir, fais DSPLICPGM puis 10 et regarde dans la liste s'il apparaît.

    Si le produit n'est pas installé, tu l'as dans l'os

    S'il est présent, lis, et ça va t'aider, le paragraphe qui parle des ENCRYPTION FUNCTIONS ici.

    Donc, ajoute "FOR BIT DATA" à la variable à encrypter dans ta table en la recréant ou fais ALTER de la colonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE MaBib.MaTable (MaColCryptée CHAR(...) FOR BIT DATA) 
    ou bien 
    ALTER TABLE MaBib.MaTable ALTER COLUMN 
    MaColCryptée SET DATA TYPE char( ...) FOR BIT DATA
    
    puis 
    
    SELECT DECRYPT_CHAR(MaColCryptée )

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 97
    Points : 79
    Points
    79
    Par défaut
    Merci mercure pour tes réponses.

    Le produit est installé, j'avais vérifier cela.

    J'ai lu le lien dont tu parle; trés intérréssant, je ne l'avais pas trouvé lors de mes recherches.

    Consernant ma colonne, je l'ai bien crée avec le [FONT=Times New Roman]CCSID 65535 qui va bien.[/FONT]

    en fait j'avais précisé FOR BIT DATA mais en regardant les dll sql par la

    suite pour la détruire et la recreer il m'avait remplacé cette précision

    automatiquement par le CCSID qui va bien.

    Pour répondre a ta question, en précisant la clé de cryptage directement puis en utilisant la fonction descrypt_char, je retrouve deja la valeur de ma colonne.

    sauf que mon soucis et l'automatisation du cryptage via un trigger insert et un trigger update qui récurere le password de maniére automatique par l'analyse (via une procédure) de la colonne concerné.
    (d'ou dans la procedure l'utilisation de la fonction gethint puis la recherche de la cle grace a mon hint dans une table de parametrage perso de mon application.)

    Je souhaite faire ceci pour que le codage des programmes accedant a cette colonne ne comporte jamais en clair la clé de cryptage. (en faite je déporte le cryptage hors des différents pgm ainsi, c'est la db qui gére.)

    oila.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 97
    Points : 79
    Points
    79
    Par défaut
    Je part en vacance 1 semaine.

    Ne m'en voulez pas si je ne réponds plus.

    Mais le sujet m'intéresse a fonds.

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    ça tombe bien ! Je n'ai pas d'AS400 sous la main pour tester. J'en aurai un quand ma connexion ADSL Orange sera enfin rétablie.

  8. #8
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    STP, colle ici le coding de toutes tes procédures y compris celui de la table matableparametre et du trigger, pour que j'y voie + clair et que je puisse tester sur "mon" AS400.

Discussions similaires

  1. Probleme dans une procedure global
    Par karim15 dans le forum WinDev
    Réponses: 2
    Dernier message: 28/12/2012, 18h10
  2. probleme de boucle while dans une procedure stockée
    Par aboulemagnifique dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 08/08/2007, 12h39
  3. Probleme dans une Procedure stockee
    Par Knightrider76 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/06/2007, 17h45
  4. Probleme dans une procedure stockée
    Par malbaladejo dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 07/07/2004, 14h08
  5. [TP]code asm dans une procedure
    Par M.Dlb dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 17/08/2002, 20h43

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