[php] MD5 functies

Pagina: 1
Acties:

Onderwerpen


  • WOmBaT
  • Registratie: September 2000
  • Laatst online: 02-09 07:31

WOmBaT

Nyaaa!!!

Topicstarter
Hoi,

Voor een programma dat ik heb gemaakt heb ik een beveiligingssysteem ingebouwd dat md5 gebruikt. Nu wil ik de generatie van gebruikerscode liever ook via een php script kunnen genereren.

Het probleem is echter dat ik in de code voor de generatie gebruik maak van de md5update functie die blijkbaar niet geexporteerd wordt door php.
De enige twee functies die er zijn zijn de md5() en de md5_file() functies. Gisteren en vandaag heb ik lopen zoeken naar aparte code die deze functies kunnen leveren, maar niets kunnen vinden.

Tijdelijk heb ik het afgehandeld met een delphi console applicatie die commandline informatie opneemt en weer uitspuugt. Het doelsysteem wordt echter linux en deze niet al te elegante oplossing zal daar ook niet werken. Een apache/php module gaat dus waarschijnlijk ook niet werken, omdat ik niet in de config kan komen.

Het liefst wil ik dit ook niet oplossen via een clientside javascript, maar alles via een afgeschermd php script genereren. Hoe kan ik dit oplossen of zal ik de javascript code gewoon moeten proberen te porten naar php?

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

wat is er niet toereikend aan md5 (), precies, want dat wordt me niet helemaal duidelijk uit je post?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

WOmBaT schreef op 12 December 2002 @ 15:54:
Het probleem is echter dat ik in de code voor de generatie gebruik maak van de md5update functie die blijkbaar niet geexporteerd wordt door php.
Dit is geen php-functie, afaik. Gebruik je een aparte lib of zo, en wat bedoel je met "geexporteerd"?
De enige twee functies die er zijn zijn de md5() en de md5_file() functies. Gisteren en vandaag heb ik lopen zoeken naar aparte code die deze functies kunnen leveren, maar niets kunnen vinden.
Code die ze moeten leveren? Als in "geencrypte data" of als in "software"? Huh :?
Tijdelijk heb ik het afgehandeld met een delphi console applicatie die commandline informatie opneemt en weer uitspuugt. Het doelsysteem wordt echter linux en deze niet al te elegante oplossing zal daar ook niet werken.
Kylix iets voor jou? 't Is wel een bitch van een download, maar het zou kunnen werken.


Journalism is printing what someone else does not want printed; everything else is public relations.


  • WOmBaT
  • Registratie: September 2000
  • Laatst online: 02-09 07:31

WOmBaT

Nyaaa!!!

Topicstarter
drm schreef op 12 december 2002 @ 16:04:
wat is er niet toereikend aan md5 (), precies, want dat wordt me niet helemaal duidelijk uit je post?
Er is alleen een md5 functie die een hash berekent van een string. De md5update combineert twee hashes en dat gebruik ik ook in mijn delphi code. Pas daarna wordt er een string van de hash gemaakt.

De MD5 functie doet dit:
code:
1
2
3
4
5
6
7
8
function MD5String(M: string): MD5Digest;
var
    Context: MD5Context;
begin
    MD5Init(Context);
    MD5Update(Context, pChar(M), length(M));
    MD5Final(Context, Result);
end;

Vervolgens wordt de MD5Context doorgevoerd naar een functie die er een string van maakt. In php zit ik dus met losse hashes die ik niet kan combineren.

Wat ik eigenlijk in mijn code gebruik is dit:
code:
1
2
3
4
5
6
7
8
9
10
11
function deelVanCode(string1, string2: string): string;
var
    Context: MD5Context;
    Digest: MD5Digest;
begin
    MD5Init(Context);
    MD5Update(Context, pChar(string1), length(string1));
    MD5Update(Context, pChar(string2), length(string2));
    MD5Final(Context, Digest);
                result := MD5Print(Digest);
end;
Rataplan schreef op 12 december 2002 @ 16:10:
[...]
Dit is geen php-functie, afaik. Gebruik je een aparte lib of zo, en wat bedoel je met "geexporteerd"?
PHP gebruikt intern wel al deze functies. De enige twee functies die php voor je beschikbaar maakt zijn een functie MD5() die een hash levert van een ingevoerde string en een MD5_File() functie die een hash teruggeeft van een bestand. Beide hashes worden teruggeleverd als een string.
Code die ze moeten leveren? Als in "geencrypte data" of als in "software"? Huh :?
Een PHP script dat wel de MD5Init/MD5Update/MD5Final etc levert. Gewoon een script wat je zou kunnen includen en zo gebruik maken van deze functies in je eigen script.
Kylix iets voor jou? 't Is wel een bitch van een download, maar het zou kunnen werken.
Ik vind het gebruik van een commandline applicatie niet echt een nette oplossing. Daarnaast weet ik ook niet zeker of ik wel permissie heb om eigen programma's te draaien. Ik denk het eigenlijk niet (bij Endoria)

[ Voor 17% gewijzigd door WOmBaT op 12-12-2002 17:18 . Reden: duidelijker gemaakt ]


  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

Bedoel je toevallig zoiets?

Wat je code betreft: moet
code:
1
MD5Update(Context, pChar(string1), length(string2));
niet toevallig
code:
1
MD5Update(Context, pChar(string1), length(string1));
zijn?


Journalism is printing what someone else does not want printed; everything else is public relations.


  • WOmBaT
  • Registratie: September 2000
  • Laatst online: 02-09 07:31

WOmBaT

Nyaaa!!!

Topicstarter
Rataplan schreef op 12 December 2002 @ 16:37:
Bedoel je toevallig zoiets?

Wat je code betreft: moet
code:
1
MD5Update(Context, pChar(string1), length(string2));
niet toevallig
code:
1
MD5Update(Context, pChar(string1), length(string1));
zijn?
Klopt :P, dit is ook zo, maar ik had dit even uit het hoofd getypt; de echte code werkt wel goed.

  • Soultaker
  • Registratie: September 2000
  • Nu online
Een PHP module is zo gemaakt:
http://www.zend.com/zend/api.php

Los daarvan vraag ik me af waarom je eigenlijk die update functie wilt gebruiken. Die is namelijk alleen nuttig als je je gevens in meerdere stukken op wilt breken en over het geheel een MD5 hash wilt berekenen. Als het om minder dan een paar megabyte aan gegevens gaat, kun je dus net zo goed alles in je geheugen laden en dan in één keer de PHP MD5() functie er overheen halen.

  • WOmBaT
  • Registratie: September 2000
  • Laatst online: 02-09 07:31

WOmBaT

Nyaaa!!!

Topicstarter
Op de doelserver zal ik niet in de config kunnen komen en dus vallen modules af.
Los daarvan vraag ik me af waarom je eigenlijk die update functie wilt gebruiken. Die is namelijk alleen nuttig als je je gevens in meerdere stukken op wilt breken en over het geheel een MD5 hash wilt berekenen. Als het om minder dan een paar megabyte aan gegevens gaat, kun je dus net zo goed alles in je geheugen laden en dan in één keer de PHP MD5() functie er overheen halen.
Omdat het algoritme al gemaakt is en daarbij maak ik gebruik van meerdere MD5Update instructies. Ik zal dan dus eerst een update met een aangepast algoritme uit moeten brengen, zodat ik op deze manier wel de keys kan genereren. Ik ga nu eerst maar eens proberen de javascript implementatie van de md5 functies te porten naar php. Iets anders zit er waarschijnlijk niet op.

[ Voor 1% gewijzigd door WOmBaT op 12-12-2002 22:51 . Reden: blaat :P ]


  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
OK, toevallig ben ik daar vorige week nog mee bezig geweest en het resultaat is dit:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function hmac_md5($data, $key='') {
    // Creates a HMAC digest that can be used for auth purposes
    // See RFCs 2104, 2617, 2831
    // Uses mhash() extension if available
    if (extension_loaded('mhash')) {
      if ($key== '') {
        $mhash=mhash(MHASH_MD5,$data);
      } else {
        $mhash=mhash(MHASH_MD5,$data,$key);
      }
      return $mhash;
    }
    if (!$key) {
         return pack('H*',md5($data));
    }
    $key = str_pad($key,64,chr(0x00));
    if (strlen($key) > 64) {
        $key = pack("H*",md5($key));
    }
    $k_ipad =  $key ^ str_repeat(chr(0x36), 64) ;
    $k_opad =  $key ^ str_repeat(chr(0x5c), 64) ;
    /* Heh, let's get recursive. */
    $hmac=hmac_md5($k_opad . pack("H*",md5($k_ipad . $data)) );
    return $hmac;
}


DIt is wat we nu gebruiken in SquirrelMail 1.3.3 CVS om cram-md5 and digest-md5 login methoden te ondersteunen. Zie ook
http://cvs.sf.net/cgi-bin...e=text/vnd.viewcvs-markup

[ Voor 18% gewijzigd door stekkel op 12-12-2002 23:46 ]


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Nu online
WOmBaT schreef op 12 december 2002 @ 22:50:
Op de doelserver zal ik niet in de config kunnen komen en dus vallen modules af.
Kun je ze ook niet dynamisch laden dan? (En waarom zeg je dat dan niet eerder?)

Acties:
  • 0 Henk 'm!

  • WOmBaT
  • Registratie: September 2000
  • Laatst online: 02-09 07:31

WOmBaT

Nyaaa!!!

Topicstarter
Soultaker schreef op 13 December 2002 @ 12:13:
Kun je ze ook niet dynamisch laden dan? (En waarom zeg je dat dan niet eerder?)
Ik had al gezegd dat ik geen permissies had om executables te draaien en daarnaast de configs aan te passen. Ik had het iets duidelijker moeten zeggen :P

Ik zal eens kijken naar de mogelijkheid tot dynamisch inladen.
stekkel schreef op 12 december 2002 @ 23:43:
OK, toevallig ben ik daar vorige week nog mee bezig geweest en het resultaat is dit:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function hmac_md5($data, $key='') {
    // Creates a HMAC digest that can be used for auth purposes
    // See RFCs 2104, 2617, 2831
    // Uses mhash() extension if available
    if (extension_loaded('mhash')) {
      if ($key== '') {
        $mhash=mhash(MHASH_MD5,$data);
      } else {
        $mhash=mhash(MHASH_MD5,$data,$key);
      }
      return $mhash;
    }
    if (!$key) {
         return pack('H*',md5($data));
    }
    $key = str_pad($key,64,chr(0x00));
    if (strlen($key) > 64) {
        $key = pack("H*",md5($key));
    }
    $k_ipad =  $key ^ str_repeat(chr(0x36), 64) ;
    $k_opad =  $key ^ str_repeat(chr(0x5c), 64) ;
    /* Heh, let's get recursive. */
    $hmac=hmac_md5($k_opad . pack("H*",md5($k_ipad . $data)) );
    return $hmac;
}
Hoe gebruik ik deze functie, want ik krijg nu enkel binary data terug?

[ Voor 4% gewijzigd door WOmBaT op 13-12-2002 13:34 ]


Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
bin2hex($hmac) mischien?

Wanneer je over over Digest-MD5 praat dan is de key overigens '' (empty string), oftewel je hoeft alleen het data argument mee te geven

Acties:
  • 0 Henk 'm!

  • WOmBaT
  • Registratie: September 2000
  • Laatst online: 02-09 07:31

WOmBaT

Nyaaa!!!

Topicstarter
stekkel schreef op 13 december 2002 @ 13:47:
bin2hex($hmac) mischien?

Wanneer je over over Digest-MD5 praat dan is de key overigens '' (empty string), oftewel je hoeft alleen het data argument mee te geven
Thanx. Zal eens proberen of ik met deze functie op iets vergelijkbaars uitkom als in delphi :)

Acties:
  • 0 Henk 'm!

  • aj-san
  • Registratie: Februari 2001
  • Laatst online: 17-08 12:23
Als je zo rfc1321 eens bekijkt moet het toch wel in PHP na te maken zijn zou je zeggen. Vind het op zich eigenlijk ook wel een goeie request voor PHP, kan met (relatief) weinig moeite geimplementeerd worden en zouden een hoop mensen errug blij mee zijn denk ik :)

Don't try... do. Or do not. There is no try. -- Master Yoda


Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
WOmBaT schreef op 12 December 2002 @ 22:50:
Omdat het algoritme al gemaakt is en daarbij maak ik gebruik van meerdere MD5Update instructies. Ik zal dan dus eerst een update met een aangepast algoritme uit moeten brengen, zodat ik op deze manier wel de keys kan genereren. Ik ga nu eerst maar eens proberen de javascript implementatie van de md5 functies te porten naar php. Iets anders zit er waarschijnlijk niet op.
En het is niet mogelijk elk van die functieaanroepen te vervangen door een string concatenatie?

Acties:
  • 0 Henk 'm!

  • WOmBaT
  • Registratie: September 2000
  • Laatst online: 02-09 07:31

WOmBaT

Nyaaa!!!

Topicstarter
OlafvdSpek schreef op 13 December 2002 @ 16:11:
[...]

En het is niet mogelijk elk van die functieaanroepen te vervangen door een string concatenatie?
Dat zou ik in een nieuwe versie kunnen doen. De implementatie van zo'n versie in php is eenvoudig, dus misschien probeer ik het zo. De mhash library is ook niet beschikbaar op de server, dus dan ga ik het wel proberen via concatenaties :)

Acties:
  • 0 Henk 'm!

  • WOmBaT
  • Registratie: September 2000
  • Laatst online: 02-09 07:31

WOmBaT

Nyaaa!!!

Topicstarter
Van ellende maar gewoon lekker zitten proberen. Ik wilde het eerst nog proberen via een perl script, maar ik ben er nu achter hoe het geheel werkt. :+
PHP:
1
MD5('string1'.'string2');

Is gelijk aan

Delphi:
1
2
3
4
5
6
7
8
9
10
var Context:   MD5Context;
      Digest:      MD5Digest; 
      MD5Hash: String;
begin 
  MD5Init(Context);
  MD5Update(Context, PChar('string1'), Length('string1'));
  MD5Update(Context, PChar('string2'), Length('string2'));
  MD5Final(Context, Digest);
  MD5String := MD5Print(Digest);
end;


Bij beiden komt hier de hash 8fe350bcaddfdbaea027ba3e7a232005 uit.
Hieruit volgt dat meerdere update statements te vervangen zijn door een enkel updatestatement met de concatenatie van deze strings in de volgorde van de updatestaments.
Delphi:
1
2
3
4
5
6
7
8
MD5Update(Context, PChar('blaat'), Length('blaat'));
MD5Update(Context, PChar('is'), Length('is'));
MD5Update(Context, PChar('een'), Length('een'));
MD5Update(Context, PChar('schaap'), Length('schaap'));

// kan dus vervangen worden door
strings := 'blaat' + 'is' + 'een' + 'schaap';
MD5Update(Context, PChar(strings), Length(strings));

Het kan dus gewoon in php, zij het op een iets andere manier :)

[ Voor 15% gewijzigd door WOmBaT op 15-12-2002 14:09 . Reden: layoutverneuking :( ]


Acties:
  • 0 Henk 'm!

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
WOmBaT schreef op 15 December 2002 @ 14:08:
Het kan dus gewoon in php, zij het op een iets andere manier :)
Dat wisten we al.
En het is niet mogelijk elk van die functieaanroepen te vervangen door een string concatenatie?

Acties:
  • 0 Henk 'm!

  • WOmBaT
  • Registratie: September 2000
  • Laatst online: 02-09 07:31

WOmBaT

Nyaaa!!!

Topicstarter
OlafvdSpek schreef op 15 december 2002 @ 14:37:
[...]

Dat wisten we al.

[...]
Stom van me :P ... verkeerd gelezen :'( :>

[ Voor 5% gewijzigd door WOmBaT op 15-12-2002 14:39 ]

Pagina: 1