Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi PHP hmac+salt in Delphi (https://www.delphipraxis.net/166215-php-hmac-salt-delphi.html)

simmi 3. Feb 2012 08:33


PHP hmac+salt in Delphi
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

wir haben ein in PHP geschriebenes Projekt. Das Login erfolgt über Nutzername und Passwort. In meinem Delphi Projekt soll nun die gleiche Anmeldung erfolgen, weil beide Projekte mit der gleichen Tabelle arbeiten. Mir liegt dazu folgender PHP Quelltext vor:

Damit wird der Hash erzeugt
Code:
   public static function bcrypt_encode($password, $global_salt, $rounds='12')
    {
        if (@CRYPT_BLOWFISH != 1)
        {throw new Exception("CRYPT_BLOWFISH != 1");}
        # 22 byte unique random token within symbol-range
        $individual_salt = substr(str_shuffle('./0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'), 0, 22);

        return crypt(hash_hmac("whirlpool",$password,$global_salt,true),'$2a$'.$rounds.'$'.$individual_salt);
    }
Die Abfrage nach dem korrekten Passwort die ich auch durchführen muss.
Code:
public static function bcrypt_check($password, $global_salt, $stored)
    {
        if (@CRYPT_BLOWFISH != 1)
        {throw new Exception("CRYPT_BLOWFISH != 1");}

        return crypt(hash_hmac("whirlpool",$password,$global_salt,true),substr($stored, 0, 30)) == $stored;
    }
Mein Problem ist dieser Teil crypt(hash_hmac("whirlpool",$password,$global_salt,true),substr($stored, 0, 30))

Ich muss an dieser Stelle zugeben, dass meine PHP Kenntnisse sehr dürftig sind. In einem Beitrag habe ich einen Verweis auf units von Wolfgang Ehrhardt gefunden. Ich habe mir den Ordner crc_hash_2010-12-19 heruntergeladen habe aber keinen Plan, wie ich das mit den darin enthaltenen units umsetzen kann.

Bitte um Hilfe.

simmi 6. Feb 2012 07:22

AW: PHP hmac+salt in Delphi
 
Kennt sich damit keiner aus?

gammatester 6. Feb 2012 08:15

AW: PHP hmac+salt in Delphi
 
Was genau ist denn Dein Problem?

Mit dem CRC/Hash-Archiv wirst Du nur den HMAC_Whirlpool berechnen können.

Da schwirrt doch noch ein Crypt/Blowfish mit 'rum! Wenn Du genaue Specs (am besten mit Testdaten) angeben kannst, wie die PHP-Funktionen arbeiten, kann ich Dir sagen, wie Du dies in Delphi nachbilden kannst. Besonders wichtig sind detailierte Angaben zur Crypt-Funktion: Padding, Betriebsmodus, was ist rounds etc.

Ich denke mit Grausen an das sogenannte MD5-Crypt...

simmi 6. Feb 2012 10:20

AW: PHP hmac+salt in Delphi
 
Hallo gammatester,

also "if (@CRYPT_BLOWFISH != 1)" soll scheinbar nur ausgeführt werden, wenn noch kein Passwort vorhanden ist.(Denke ich in meinem jugendlichen Leichtsinn).
In dem Teil
Code:
crypt(hash_hmac("whirlpool",$password,$global_salt,true),substr($stored, 0, 30)) == $stored;
Ich denke, dass ich nur diesen Code nachvollziehen muss, da die Passworte im PHP Projekt auf Server 2008 erzeugt werden. (Das ist nicht meine Idee). Ich werde also zunächst einmal versuchen Testdaten zu bekommen und mich um die Function "Crypt" kümmern.

Danke auf jeden Fall für Deine Wortmeldung.

gammatester 6. Feb 2012 13:01

AW: PHP hmac+salt in Delphi
 
Hier ein Testprogramm mit dem Fallbeispiel von PHP-Net-Manula zu hash_hmac:
Delphi-Quellcode:
{-Test prog for HMACs, we 06.Feb.2012}

program t_hmac1;

{$i STD.INC}

{$ifdef APPCONS}
  {$apptype console}
{$endif}

uses
  hash,hmac,whirl512,rmd160,BTypes,mem_util;


{---------------------------------------------------------------------------}
procedure Test_RMD160;
const
  DigLen = sizeof(TRMD160Digest);
const
  fox : Bstring = 'The quick brown fox jumped over the lazy dog.';
  key : BString = 'secret';
var
  ctx : THMAC_Context;
  mac : THashDigest;
  phash: PHashDesc;
begin
  writeln('Test from http://php.net/manual/en/function.hash-hmac.php');
  writeln('hash_hmac(''ripemd160'', ''The quick brown fox jumped over the lazy dog.'', ''secret'')');
  phash := FindHash_by_Name('RIPEMD160');
  if phash=nil then begin
    writeln('Hash function not found/registered.');
    exit;
  end;
  hmac_init(ctx, phash, @key[1], length(key));
  hmac_update(ctx, @fox[1], length(fox));
  hmac_final(ctx, mac);
  writeln('Calc: ',HexStr(@mac, DigLen));
  writeln(' Ref: ','b8e7ae12510bdfb1812e463a7f086122cf37e4f7');
end;


{---------------------------------------------------------------------------}
procedure Test_Whirlpool;
const
  DigLen = sizeof(TWHirlDigest);
const
  fox : Bstring = 'The quick brown fox jumped over the lazy dog.';
  key : BString = 'secret';
var
  ctx : THMAC_Context;
  mac : THashDigest;
  phash: PHashDesc;
begin
  writeln('Test from http://php.net/manual/en/function.hash-hmac.php');
  phash := FindHash_by_Name('Whirlpool');
  if phash=nil then begin
    writeln('Hash function not found/registered.');
    exit;
  end;
  hmac_init(ctx, phash, @key[1], length(key));
  hmac_update(ctx, @fox[1], length(fox));
  hmac_final(ctx, mac);
  writeln('Calc: ',HexStr(@mac, DigLen));
end;


begin
  Test_RMD160;
  writeln;
  Test_Whirlpool;
end.
Die Ausgabe ist:
Code:
Test from http://php.net/manual/en/function.hash-hmac.php
hash_hmac('ripemd160', 'The quick brown fox jumped over the lazy dog.', 'secret')
Calc: b8e7ae12510bdfb1812e463a7f086122cf37e4f7
 Ref: b8e7ae12510bdfb1812e463a7f086122cf37e4f7

Test from http://php.net/manual/en/function.hash-hmac.php
Calc: 8bcb967604ee2f25718b1e9a9f9a87f16d41b678fb1537a56a0456400c78d6dc1b6ffe6d7a17761396f55119d853647e5746e88e7b3a3629b497d4e5f953cf0b

simmi 6. Feb 2012 13:10

AW: PHP hmac+salt in Delphi
 
Wahnsinn!!!:cheer:

Das hilft mir weiter und ich kann die Verwendung der units daran nachvollziehen. Ich danke Dir für Deine Hilfe!

DP-Maintenance 26. Apr 2012 17:36

Dieses Thema wurde am "26. Apr 2012, 18:36 Uhr" von "fkerber" aus dem Forum "Neuen Beitrag zur Code-Library hinzufügen" in das Forum "Algorithmen, Datenstrukturen und Klassendesign" verschoben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz