PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WEBDEV 25 → Cryptage / Décryptage ...
Cryptage / Décryptage ...
Iniciado por kick71, jul., 30 2020 8:12 AM - 16 respostas
Membro registado
531 mensagems
Popularité : +2 (4 votes)
Publicado em julho, 30 2020 - 8:12 AM
Bonjour à tous,

Je dois crypter des zones dites sensibles ( RGPD / Mdp / Infos bancaires ) dans des rubriques de fichiers HFCS ( Serveur ).
Ces rubriques sont au format Texte.

J'utilise 2 petites procédures, en apparence simple, mais lors du décryptage, cela ne passe pas et renvoie toujours une chaîne vide. Le cryptage semble bon ( pas d'erreur ).

Ci-joint mes 2 procédures. Si vous aviez une idées lumineuse pour corriger le décryptage ? Un pb de format en binaire et chaîne peu être ?

Un grand merci pour votre aide.
Courage à ceux qui ne sont pas en wac !






--
Christian - kick71
Publicado em julho, 30 2020 - 2:06 PM
les fonctions de cryptage retournent du binaire qui n'est pas stockable dans une zone texte.

Le plus simple est de crypter LE FICHIER ENTIER, et de hasher les mots de passe puis de les stocker en hexa ou base64
Membro registado
723 mensagems
Popularité : +3 (5 votes)
Publicado em julho, 30 2020 - 3:27 PM
Bonjour
@kick71 : copiez/colller votre code plutôt qu'une image se sera plus simple pour reproduire votre problème.

PROCÉDURE CryptageValeur(lavaleur est une chaîne):Buffer
smessage est un Buffer = lavaleur
bufclef est un Buffer = HashChaîne(HA_MD5_128,"maclef")
bufcrypte est un Buffer = CrypteStandard(smessage,bufclef)
RENVOYER bufcrypte


PROCÉDURE DecrypteValeur(lavaleur est un Buffer):Buffer
bufclef est un Buffer = HashChaîne(HA_MD5_128,"maclef")
bufdecrypte est un Buffer = DécrypteStandard(lavaleur,bufclef)
RENVOYER bufdecrypte


Trace(DecrypteValeur(CryptageValeur("test"))) // affche test


@Argus : une chaine peut très bien contenir des cractères dit "non imprimable"
maChaine est une chaîne = CryptageValeur("test")
Trace(maChaine) // affiche : 0+BG\Õ³û·®1&ìóÞ¤ÒÅrwBŠHö¾{?ÅÊy
myBuffer est un Buffer = maChaine
maChaine = DecrypteValeur(myBuffer)
Trace(maChaine) // affiche : test


--
« L'erreur ne devient pas vérité parce qu'elle se propage et se multiplie ; la vérité ne devient pas erreur parce que nul ne la voit. » Gandhi
Publicado em julho, 30 2020 - 7:54 PM
caractères non imprimables, oui, ZERO BINAIRE non, c'est la fin de chaine... et dans une chaine cryptée, à un moment ou à un autre, on va avoir un zéro binaire qui va nous faire perdre le reste des infos, d'ou le problème décrit.

Ce n'est pas pour rien que les fonctions de cryptages donnent leur résultat comme un BUFFER et pas une chaine.
Membro registado
531 mensagems
Popularité : +2 (4 votes)
Publicado em julho, 31 2020 - 8:29 AM
Bonjour Argus et Philippe,
Merci pour vos réponses.


Quand je fais le cryptage et décryptage dans un même code oui, cela fonctionne et fonctionnais déjà avant.
Mais quand je test sur une page de test les deux fonctions le décryptage ne fonctionne pas ! C'est bien la mon, soucis depuis le départ.





--
Christian - kick71
Membro registado
41 mensagems
Publicado em julho, 31 2020 - 9:56 AM
Bonjour,
début de piste

Est ce que votre problème vient quand vous allez chercher la chaîne cryptée dans votre base et que vous voulez la décrypter ?
Si oui vérifier la taille de la rubrique qui stock votre chaîne car celle-ci n'est peut-être pas complète.

--
Bon dev

Thibault
Membro registado
531 mensagems
Popularité : +2 (4 votes)
Publicado em julho, 31 2020 - 10:12 AM
Bonjour Thibault,
Dois-je la définir en Memo ? ou une taille définie ?

--
Christian - kick71
Membro registado
531 mensagems
Popularité : +2 (4 votes)
Publicado em julho, 31 2020 - 10:14 AM
Dans ma page de test, les zones de saisies n'ont pas de taille prédéfinies et cela ne fonctionne pas non plus

--
Christian - kick71
Membro registado
41 mensagems
Publicado em julho, 31 2020 - 7:12 PM
Bonsoir, juste la taille dans la base et est ce que les champs sont de type mot de passe ?

--
Bon dev

Thibault
Membro registado
1.439 mensagems
Popularité : +9 (11 votes)
Publicado em agosto, 01 2020 - 9:13 AM
Bonjour,

HFSQL permet des rubriques de type mémo binaire. A tester pour stocker ces données...

--
Cordialement
François
Membro registado
723 mensagems
Popularité : +3 (5 votes)
Publicado em agosto, 01 2020 - 5:00 PM
Bonjour
@ Argus : Après la lecture de votre message je me suis traité d'idiot pour ne pas avoir pensé au 0x00.
Pourtant je n'ai jamais eu de problème alors je me suis livré à ce petit test
UneChaine est une chaîne = "ABC"+Caract(0x0)+"DEF"
Trace(UneChaine) // Affiche "ABC" et c'est normal
Trace(Taille(UneChaine)) // Affiche 7 alors que je m'attendais à 3
UneAutreChaine est une chaîne = UneChaine
Trace(Taille(UneAutreChaine)) // Affiche 7 et UneAutreChaine contient bien "ABC"+Caract(0x0)+"DEF"

Une explication ?

--
« L'erreur ne devient pas vérité parce qu'elle se propage et se multiplie ; la vérité ne devient pas erreur parce que nul ne la voit. » Gandhi
Membro registado
76 mensagems
Publicado em agosto, 02 2020 - 3:51 AM
Bonsoir,

Ma version, qui fonctionne pour ce que j'ai eu à traiter jusqu'à maintenant.
Je sauvegarde les données cryptées sous leur format HEXA.

Dans mon cas, ce sont des paramètres système stockés dans un fichier texte.
J'assume qu'une rubrique TEXTE aura le même comportement.

De mémoire, la transition vers UNICODE a résolu mes problèmes.
De mémoire...

Deux procédures globales que je lance à la volée selon les besoins.


PROCÉDURE GlbSecCrypte(pChaîneÀCrypter est une chaîne = "", pCléCryptage est une chaîne = "")
//
//--- Validations
SI pCléCryptage = "" ALORS RENVOYER ""
//
//--- Passe en UNICODE
uCléUNI est un Buffer = AnsiVersUnicode(pChaîneÀCrypter)
//
//--- Génère la séquence numérique de la clé
uCléPwd est un Buffer = HashChaîne(HA_MD5_128, AnsiVersUnicode(pCléCryptage))
//
//--- Crypte la chaîne selon sa clé
uCléCry est un Buffer = CrypteStandard(uCléUNI, uCléPwd, crypteAES128)
//
//--- Retourne la chaîne cryptée sous forme HEXA
RENVOYER BufferVersHexa(uCléCry, SansRegroupement)
//
//--- EOF


PROCÉDURE GlbSecDécrypte(pChaîneÀDécrypter est une chaîne = "", pCléDéCryptage est une chaîne = "")
//
//--- Validations
SI pChaîneÀDécrypter = "" OU pCléDéCryptage = "" ALORS RENVOYER ""
//
//--- Retourne la chaîne crypté sous son format original
uCléCry est un Buffer = HexaVersBuffer(pChaîneÀDécrypter)
//
//--- Génère la séquence numérique de la clé
uCléPwd est un Buffer = HashChaîne(HA_MD5_128, AnsiVersUnicode(pCléDéCryptage))
//
//--- Décrypte la chaîne selon sa clé
uCléTxt est un Buffer = DécrypteStandard(uCléCry, uCléPwd, crypteAES128)
//
//--- Retourne la clé sous sa forme originale
RENVOYER UnicodeVersAnsi(uCléTxt)
//
//--- EOF


Bon Dev.

Serge

--
-----
Parfois, la logique est implacable...
Publicado em agosto, 03 2020 - 3:21 PM
pas d'explication, non... mais j'ai constaté depuis longtemps que tant qu'on est :
- dans le même code
- en windev

on peut effectivement avoir un zero binaire qui ne pose pas problème dans une chaine (crypter et décrupter dnas une chaine, par exemple)

Par contre, dés qu'on commence à enregistrer, transférer, passer en paramètre et toute cette sorte de choses, ou changer d'environnement (mobile et autre) on perd ce qui est après le zero binaire.

C'est trompeur, et ca m'a fais rentrer dans le même mur il y a longtemps... Maintenant je sais ou est le mur et je contourne :-)
Membro registado
723 mensagems
Popularité : +3 (5 votes)
Publicado em agosto, 03 2020 - 11:35 PM
Bonjour
Effectivement c'est louche cette gestion du type chaine car ce code est parfaitement valide
UneChaine est une chaîne = "ABC" + Caract(0x0) + "DEF" + Caract(0x0) + "GHI"
Trace(ExtraitChaîne(UneChaine, 2, Caract(0x0))) // et renvoi bien "DEF"



Argus a écrit :
pas d'explication, non... mais j'ai constaté depuis longtemps que tant qu'on est :
- dans le même code
- en windev

on peut effectivement avoir un zero binaire qui ne pose pas problème dans une chaine (crypter et décrupter dnas une chaine, par exemple)

Par contre, dés qu'on commence à enregistrer, transférer, passer en paramètre et toute cette sorte de choses, ou changer d'environnement (mobile et autre) on perd ce qui est après le zero binaire.

C'est trompeur, et ca m'a fais rentrer dans le même mur il y a longtemps... Maintenant je sais ou est le mur et je contourne


--
« L'erreur ne devient pas vérité parce qu'elle se propage et se multiplie ; la vérité ne devient pas erreur parce que nul ne la voit. » Gandhi
Membro registado
531 mensagems
Popularité : +2 (4 votes)
Publicado em agosto, 04 2020 - 9:26 AM
Bonjour Monsieur Serge

J'ai adapté mon code, en fonction du votre pour le cryptage/décryptage.
Cela passe mieux, enfin un peu plus loin, je m'explique.

Ces zones que je dois crypter et décrypter sont ensuite stockées dans un fichier HFCS.
Le cryptage comme d'habitude ne pose aucun Pb, mais lors du décryptage ( récupération du fichier HFCS ), j'ai un soucis sur une rubrique ( IBAN ).

Je ne sais pas si le pb vient de la longueur de la rubrique stockée ou du typage.
Celle-ci comme les autres sont de type chaîne, avec taille 150.

Lors du décryptage, j'ai le message suivant :





Une idée de votre part ?

Merci par avance.
Si pas de soluce je vais voir à utiliser une autre méthode de cryptage que celle fournie par PCSOFT

--
Christian - kick71
Membro registado
531 mensagems
Popularité : +2 (4 votes)
Publicado em agosto, 04 2020 - 10:02 AM
Après test, le passage en "memo texte" semble résoudre mon pb !

--
Christian - kick71
Membro registado
76 mensagems
Publicado em agosto, 06 2020 - 5:20 AM
@kick71,

La longueur totale de la chaîne cryptée peut facilement dépasser les 150 caractères.
Le mémo texte semble d'ailleurs confirmer que c'était votre cas.

Un "Taille" sur la chaîne reçue au retour du cryptage le confirmerait.

------------------------------
À noter (1):
Le zéro binaire (0x0) auquel Argus et Philippe Pasquali font référence ne passe pas avec mes procédures.
J'ai testé en codant la valeur "en dur" pour confirmer.

Pour ce qui est de mes besoins à moi ça ne cause pas de soucis.
La qualité de l'information est validée avant le cryptage.

À vous de voir si c'est un problème potentiel de votre côté.

------------------------------
À noter (2):
Ma procédure permet de crypter une chaîne à blanc ("").
Encore ici, une fonctionnalité qui répond à mes besoins.

À vous de voir si c'est un problème potentiel de votre côté.

Bon dev.

Serge

--
-----
Parfois, la logique est implacable...