Einzelnen Beitrag anzeigen

Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#1

Fehler bei Übergabe eines Salts an BCrypt

  Alt 18. Okt 2016, 13:31
Hallo zusammen,

ich komme mir schon fast blöd vor eine solche Frage hier stellen zu müssen, aber irgendwie will es nicht funktionieren.

Ich habe mir die BCrypt Unit von Jose Jimeniz besorgt und möchte damit meine Passwörter, die in der Datenbank gespeichert, hashen. BCrypt erzeugt ja automatisch einen Salt, wenn keiner mitgegeben wird. Zumindest macht es diese Unit so.

Wenn ich aber keinen Salt mitgebe, dann erhalte ich ja immer wieder einen anderen Hash. Es gibt zwar die Funktion CheckPassword() die den Salt aus dem Hash herausliest, aber ich habe an dieser Stelle den in der Datenbank gespeicherte Hash nicht zur Verfügung (bzw. möchte ihn nicht haben). Ich will das Passwort durch die Datenbank prüfen lassen.

Also dachte ich mir, dass ich mir einen benuterabhängigen Salt ausdenke und diesem an die HashPassword() Funktion übergebe. Allerdings erhalte ich dann je nachdem welche Art ich ausprobiere folgende Compilermeldungen:

Versucht habe ich folgendes:
Delphi-Quellcode:
bc.HashPassword(Password, 'Test', 12); // [dcc32 Fehler] E2250 Es gibt keine überladene Version von 'HashPassword', die man mit diesen Argumenten aufrufen kann

bc.HashPassword(Password, guid.ToByteArray, 12); // [dcc32 Fehler] E2010 Inkompatible Typen: 'string' und 'System.TArray<System.Byte>'

bc.HashPassword(Password, guid.D4, 12); // [dcc32 Fehler] E2010 Inkompatible Typen: 'string' und 'System.TArray<System.Byte>'
Die Funktion HashPassword gibt es in 3 Varianten als Überladung:

Delphi-Quellcode:
class function HashPassword(const password: UnicodeString): string; overload;
class function HashPassword(const password: UnicodeString; cost: Integer): string; overload;
class function HashPassword(const password: UnicodeString; const salt: array of Byte; const cost: Integer): TBytes; overload;

class function CheckPassword(const password: UnicodeString; const expectedHashString: string): Boolean; overload;
Der Salt Parameter ist hier als array of Byte angegeben. Allerdings habe ich keine Ahnung, was ich dorthin übergeben kann, damit ich eine solche Fehlermeldung nicht erhalte. Finde auch nirgends ein Beispiel, in dem jemand mal diese Überladung genutzt hat.

Ich denke ja mal, dass das die einzige Möglichkeit ist, immer den gleichen Hash zu erhalten, wenn ich den Salt übergebe.

Ich hoffe mir kann jemand bei meinem Problem helfen. Ziel wäre es, eine GUID als Salt zu übergeben.

Bin für jeden Tipp dankbar. Oder geht das irgendwie auch anders? Der Hash soll verglichen werden und der Benutzer darf weitermachen, wenn beide Hashes identisch sind.
  Mit Zitat antworten Zitat