Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   crypt()-Funktion aus Linux/Unix/PHP für Delphi? (Passwort-Hash) (https://www.delphipraxis.net/202575-crypt-funktion-aus-linux-unix-php-fuer-delphi-passwort-hash.html)

Bbommel 19. Nov 2019 09:24

crypt()-Funktion aus Linux/Unix/PHP für Delphi? (Passwort-Hash)
 
Wo wir es gerade im Thema nebenan schon mit Verschlüsselung und PHP haben, ich hätte da auch noch einen:

Ich bin gerade dabei, ein älteres php-Projekt neu in Delphi umzusetzen und bin dabei darüber gestolpert, dass der Kollege damals zum Berechnen der Passwort-Hashes die Funktion "crypt()" von PHP benutzt hat, welche wiederum eine bei Linux/Unix mitgelieferte Funktion crypt() nutzt. Das ist ziemlich uncool, weil die Funktion eigentlich schon damals (so etwa 2010) kaum noch jemand benutzt hat, weil sie nicht besonders sicher ist.

Die Funktion nutzt eine Abwandlung der DES-Verschlüsselung, um die Passwort-Hashes zur erstellen:
https://www.php.net/manual/de/function.crypt.php
http://man7.org/linux/man-pages/man3/crypt.3.html

Ich würde jetzt natürlich gerne dafür sorgen, dass die Passwörter der Benutzer weiter gültig bleiben, wenn ich die Anwendung auf Delphi umstelle (ich würde die Passwörter dann nach/beim Login neu mit einer modernen Hash-Funktion speichern), aber dazu müsste ich den Hash erst einmal bilden können. Weil die Funktion schon vor einiger Zeit aus der Mode gekommen ist, findet man dazu kaum etwas aktuelles. In System.Hash bei Delphi ist sie nicht dabei und auch im aktuellen DEC habe ich sie nicht gesehen. Alle Diskussionen zum Thema "crypt() in Delphi" sind eher so von 2003/2004, zuletzt mal was von 2010, aber die Links laufen alle ins Leere oder zu seit Jahren nicht mehr gepflegten Komponenten, die wahrscheinlich nicht unter Rio funktionieren.

Kurz: hat irgendwer eine funktionierende Implementation von crypt für Delphi, die auch unter einem aktuellen Delphi noch läuft?

Mein Plan B ist übrigens: MariaDB unter Linux bringt auch die Funktion "ENCRYPT" mit, welche ebenfalls "crypt()" aufrufr. Insofern: falls ich nichts für Delphi finde, dann würde ich die Hash-Berechnung für die Übergangszeit von der Datenbank machen lassen.

Alternativ könnte auch ein Plan C sein: da das fertige Programm eh unter Linux laufen soll, könnte ich ja auch selber die crypt()-Funktion aufrufen. Nur weiß ich unter Linux noch nicht wirklich, wie man Funktionen aus Bibliotheken einbindet, für die Emba noch nichts vorbereitet hat - das kenne ich bisher nur mit DLLs aus Windows. :-)

DelTurbo 19. Nov 2019 11:01

AW: crypt()-Funktion aus Linux/Unix/PHP für Delphi? (Passwort-Hash)
 
Hi,
eventuell mal lockbox 2 versuchen?!?

Bbommel 19. Nov 2019 11:21

AW: crypt()-Funktion aus Linux/Unix/PHP für Delphi? (Passwort-Hash)
 
Hm, nee, leider nicht, wenn ich die richtig verstanden habe. Habe gerade mal in Lockbox 2 und 3 reingeschaut. Da ist zwar in beiden DES mit dabei, aber leider das "richtige" DES, also die synchrone Verschlüsselung. Leider nicht die DES-Abwandlung für Hashes, welche crypt() benutzt.

DelTurbo 19. Nov 2019 11:33

AW: crypt()-Funktion aus Linux/Unix/PHP für Delphi? (Passwort-Hash)
 
Schade. Eins fällt mir noch ein. DCPcrypt. Vielleicht geht es damit.

Bbommel 19. Nov 2019 14:17

AW: crypt()-Funktion aus Linux/Unix/PHP für Delphi? (Passwort-Hash)
 
Da sieht es leider genau so aus, also: DEC ist vorhanden, aber leider nur für Cipher, nicht für Hash.

Immer vorausgesetzt, ich verstehe das da alles richtig, ist ja nicht das leichteste Thema. :-)

Dennoch Danke für deine Hilfe!

HolgerX 19. Nov 2019 15:02

AW: crypt()-Funktion aus Linux/Unix/PHP für Delphi? (Passwort-Hash)
 
Hmm..

Welchen HASH nutzt den das crypt() bei deiner PHP-App?
Je nach Salt / PHP-Version.. wird ein anderer verwendet.

Hast Du mal ein Beispiel für deinen HASH-String, wie er in deinem System für die User abgelegt wurde.

Such eventuell mal nach htpasswd, dafür wird auch das crypt() verwendet.
Jedoch kann der HASH in verschiedenen Typen dort hinterlegt sein.

In htpasswd wird am Anfang des HASH der Typ und das Salt angegeben, z.B.
$2y$10$xxxxxxxx

https://www.php.net/manual/de/function.crypt.php

https://en.wikipedia.org/wiki/Bcrypt
https://www.php.net/manual/de/functi...sword-hash.php

Erst wenn Du weist, welcher Algorithmus verwendet wird/wurde, kannst Du diesen in Delphi nachbilden.

Bbommel 19. Nov 2019 20:28

AW: crypt()-Funktion aus Linux/Unix/PHP für Delphi? (Passwort-Hash)
 
Zitat:

Zitat von HolgerX (Beitrag 1451572)
Hmm..
Welchen HASH nutzt den das crypt() bei deiner PHP-App?
Je nach Salt / PHP-Version.. wird ein anderer verwendet.

Ich dachte eigentlich, dass ich das in meinen Posts beschrieben habe. :-) crypt verwendet, wenn man nichts besonderes angibt, einen auf DES basierenden Hash-Algorithmus. Mehr dazu ist in den beiden Links zum PHP-Manual und zur Linux-Manpage beschrieben, die ich in meinem ersten Beitrag verlinkt habe.

Die von dir beschriebene Erweiterung, dass crypt auch mit anderen Hash-Algorithmen wie MD5, SHA-256 oder SHA-512 benutzt werden kann und die auch von PHP so "durchgereicht" würde, ist in der oben verlinkten Manpage im Abschnitt "Features in glibc" beschrieben. Ein Hash würde dann in der Tat mit etwas wie $1$... anfangen. Das wird aber in meinem Fall nicht genutzt (einen MD5- oder SHA-Hash bekäme ich ja mit Delphi problemlos umgesetzt, System.Hash sei Dank). Daher wird der auf DES basierende Hash benutzt. Den erkennt man z.B. daran, dass er nur die ersten zwei Zeichen eines Salt beachtet und diese auch dem Hash voranstellt.

Der Aufruf von
crypt('hallo','wuppdi')
ergibt zum Beispiel
wuOMJogK0sP0c
(der Aufruf von crypt('hallo','wumms') übrigens auch ;-) ).

Ich schau mal, ob ich mit htpasswd weiterkomme - Danke für den Tipp! Spreche nichts dagegen, das lokal aufzurufen, um diese ollen Passwörter verarbeiten zu können.

Bbommel 19. Nov 2019 20:36

AW: crypt()-Funktion aus Linux/Unix/PHP für Delphi? (Passwort-Hash)
 
Nachtrag zu htpasswd - leider hilft auch der unter Windows nicht:

Zitat:

-d
Use crypt() encryption for passwords. This is not supported by the httpd server on Windows and Netware. This algorithm limits the password length to 8 characters. This algorithm is insecure by today's standards. It used to be the default algorithm until version 2.2.17
Hm. :-( Dann bleibe ich wohl bei meinem Workaround mit dem Datenbankserver unter Linux.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:48 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