Le même MD5 qu'on soit compiler en unicode ou non !

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Le même MD5 qu'on soit compiler en unicode ou non !

Message par Thyphoon »

j'ai pas mal galéré pour trouver un bug et je pense que ma réflexion pourra servir un jour ou l'autre a quelqu'un !

Si vous demandez un MD5 d'une chaine de caractère ce MD5 va changé en fonction de si votre programme est compilé en unicode ou non !

Dans mon cas je communique via Http avec un serveur php ... et pour vérifier la requête je fabrique une clef avec la commande md5()
monsite.com/index.php?Act=Montrucafaire&key=032ab239e2e9b66badf553cde9de5981
et sur mon serveur web je créer une clef Key de la même façon que je la fabrique dans mon programme en purebasic.
Si la clef est la même sur les deux ! alors mon serveur web execute l'action !

Ca marchait tres bien au depart, lorsque j'ai basculé mon application en unicode, ma requête http était refusé car la clef fabriqué part mon application et celle fabriqué part le serveur web était différente... et cela a cause de la compilation en unicode.
Je me suis donc fait une petite fonction permettant d'avoir le même MD5 dans mon application que sur le serveur web que mon application soit compilé ou non en unicode.

Essayez ce petit programme en compilant d'abord sans l'unicode puis en unicode

Code : Tout sélectionner

Procedure.s MD5Ascii(Key.s)
  Protected *txtmem,txtSize.l,Result.s
  txtSize=StringByteLength(Key, #PB_Ascii)
   *txtmem=AllocateMemory(txtSize+2);Voir le message de fred plus bas / +1 normalement et +2 si compilé en unicode
  PokeS(*txtmem,Key,-1,#PB_Ascii)
  Result.s=MD5Fingerprint(*txtmem, txtSize)
  FreeMemory(*txtmem)
  ProcedureReturn Result
EndProcedure

;Ma procédure pour faire une requête Http et récupérer le resultat
Procedure.s ReceiveHTTPData(Url$,Filename$)
  Protected Var.s=""
  If ReceiveHTTPFile(Url$, Filename$)
      If ReadFile(0, Filename$)   ; if the file could be read, we continue...
        While Eof(0) = 0           ; loop as long the 'end of file' isn't reached
          Var=Var+ReadString(0)+Chr(10)
        Wend
        CloseFile(0)
        DeleteFile(Filename$)
      Else
        Debug "fileError"
      EndIf
  Else
    Debug "Error "   
  EndIf
  ProcedureReturn Var
EndProcedure


key.s="Test"
Debug MD5Fingerprint(@key,StringByteLength(Key))
Debug MD5Ascii(key)
vous devez remarqué que la le MD5AScii est le même dans les 2 cas
Dernière modification par Thyphoon le jeu. 12/nov./2009 10:09, modifié 2 fois.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Le même MD5 qu'on soit compiler en unicode ou non !

Message par Anonyme2 »

Salut Thyphoon,

tu peux mettre la procedure MD5() (la même avec PokeS(*txtmem,Key) ?).

J'utilise des fichiers compressés que je met en ressource dans l'archive, j'ajoute la clé MD5 au début de l'archive sans la compresser, je compare ensuite les 2 clés. Je n'avais pas pensé à ce problème unicode (j'ai encore des plantages parfois en unicode), ce code m'intéresse :D

A+
Denis
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Le même MD5 qu'on soit compiler en unicode ou non !

Message par Thyphoon »

Denis a écrit :Salut Thyphoon,

tu peux mettre la procedure MD5() (la même avec PokeS(*txtmem,Key) ?).
Heu ! lollllllllll je comprends pas bien ce que tu veux ?
la procedure MD5() est native a PB :P
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Le même MD5 qu'on soit compiler en unicode ou non !

Message par Anonyme2 »

J'ai une erreur de compilation 4.40 beta 6

MD5() n'est pas une fonction bla bla bla...
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Le même MD5 qu'on soit compiler en unicode ou non !

Message par Thyphoon »

Denis a écrit :J'ai une erreur de compilation 4.40 beta 6

MD5() n'est pas une fonction bla bla bla...
lolllllllll mais tu sais que tu as raison ... :oops: hier soir en postant, je me suis un peu mélangé les pinceaux lollllllll :P
J'ai corrigé le code sur le premier Post.
la commande MD5() c'est en PHP en PB c'est MD5Fingerprint()
Voilà c'est corrigé merci d'avoir vu l'erreur ! :D
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Le même MD5 qu'on soit compiler en unicode ou non !

Message par Anonyme2 »

Voilà en ASCCI (même clé)

0cbc6611f5540bd0809a388dc95a615b
0cbc6611f5540bd0809a388dc95a615b

Voilà en unicode (c'est différent)

8e06915d5f5d4f8754f51892d884c477
0cbc6611f5540bd0809a388dc95a615b

Ta fonction en unicode redonne bien la même clé que la compilation en ASCII
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Le même MD5 qu'on soit compiler en unicode ou non !

Message par Thyphoon »

Denis a écrit :Voilà en ASCCI (même clé)

0cbc6611f5540bd0809a388dc95a615b
0cbc6611f5540bd0809a388dc95a615b

Voilà en unicode (c'est différent)

8e06915d5f5d4f8754f51892d884c477
0cbc6611f5540bd0809a388dc95a615b

Ta fonction en unicode redonne bien la même clé que la compilation en ASCII
Et oui c'est pratique :P En tout cas moi maintenant ça marche super !
Mais je me dis qu'on peut aussi améliorer la fonction

Code : Tout sélectionner

Procedure.s MD5(Key.s,Type.l=#PB_Ascii)
  Protected *txtmem,txtSize.l,Result.s
  txtSize=StringByteLength(Key, Type)
  *txtmem=AllocateMemory(txtSize+2);Merci Fred +1 normalement et +2 si compilé en unicode
  PokeS(*txtmem,Key,-1,Type)
  Result.s=MD5Fingerprint(*txtmem, txtSize)
  FreeMemory(*txtmem)
  ProcedureReturn Result
EndProcedure
Et comme ça on peut forcer le type comme on veut #PB_Ascii, #PB_UTF8 ou #PB_Unicode
par contre moi comme je fabrique ma clef aussi du côté serveur web en php je n'y arrive qu'en #PB_Ascii
Dernière modification par Thyphoon le jeu. 12/nov./2009 10:08, modifié 1 fois.
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Re: Le même MD5 qu'on soit compiler en unicode ou non !

Message par Fred »

A faire extremement attention aux allocations dynamiques:

Code : Tout sélectionner

txtSize=StringByteLength(Key, Type) 
 *txtmem=AllocateMemory(txtSize) 
 PokeS(*txtmem,Key,-1,Type)
Ca devrait etre:

Code : Tout sélectionner

 txtSize=StringByteLength(Key, Type) 
 *txtmem=AllocateMemory(txtSize + 1)  ; Tu dois reserver une place pour le caractere null à la fin de la chaine
 PokeS(*txtmem,Key,-1,Type) 
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Le même MD5 qu'on soit compiler en unicode ou non !

Message par Thyphoon »

Fred a écrit :A faire extremement attention aux allocations dynamiques:
ça devrait etre:

Code : Tout sélectionner

 txtSize=StringByteLength(Key, Type) 
 *txtmem=AllocateMemory(txtSize + 1)  ; Tu dois reserver une place pour le caractere null à la fin de la chaine
 PokeS(*txtmem,Key,-1,Type) 
A oui tu as raison !!! j'ai tendance a oublié ce genre de detail !
Parcontre ne faudrait t'il pas faire un+2 au cas ou l'application est en unicode ?
Dans la doc
The size of the Null-Character is 1 byte for Ascii and UTF8 mode and 2 bytes for Unicode mode.
soit

Code : Tout sélectionner

 txtSize=StringByteLength(Key, Type) 
 *txtmem=AllocateMemory(txtSize + 2)  ; Tu dois reserver une place pour le caractere null à la fin de la chaine
 PokeS(*txtmem,Key,-1,Type) 
En tout cas merci d'avoir prit le temps de faire remonter mon erreur !
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Re: Le même MD5 qu'on soit compiler en unicode ou non !

Message par Fred »

utilise "sizeof(Character)" pour gerer les 2 cas.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Le même MD5 qu'on soit compiler en unicode ou non !

Message par Thyphoon »

Fred a écrit :utilise "sizeof(Character)" pour gerer les 2 cas.
Génial ! Merci beaucoup !
Répondre