Page 1 sur 1

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

Publié : mer. 11/nov./2009 22:25
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

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

Publié : jeu. 12/nov./2009 5:21
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

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

Publié : jeu. 12/nov./2009 6:06
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

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

Publié : jeu. 12/nov./2009 6:10
par Anonyme2
J'ai une erreur de compilation 4.40 beta 6

MD5() n'est pas une fonction bla bla bla...

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

Publié : jeu. 12/nov./2009 6:18
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

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

Publié : jeu. 12/nov./2009 7:16
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

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

Publié : jeu. 12/nov./2009 7:33
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

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

Publié : jeu. 12/nov./2009 9:31
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) 

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

Publié : jeu. 12/nov./2009 10:06
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 !

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

Publié : jeu. 12/nov./2009 10:38
par Fred
utilise "sizeof(Character)" pour gerer les 2 cas.

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

Publié : jeu. 12/nov./2009 10:42
par Thyphoon
Fred a écrit :utilise "sizeof(Character)" pour gerer les 2 cas.
Génial ! Merci beaucoup !