PHP crypt () gibt die falsche Antwort zurück

9

Ich glaube, ich verliere meine Murmeln hier ... Ich habe ein Problem auf meiner Website, wo sie nach dem Zufallsprinzip keine Logins mehr akzeptiert. Ich konnte es jetzt auf crypt () zurückführen, das sich sehr seltsam verhält.

In meiner Datenbank habe ich die verschlüsselte Version des Benutzerpasswortes - sagen wir mal Og12345678.

Wenn der Benutzer sich anmeldet, geben sie ihr Passwort ein, ich lese das Salz aus der Datenbank und kryptiere dann, was sie eingegeben und verglichen haben - normalerweise funktioniert das sehr gut.

Also mache ich crypt ($ inputedPassword, $ saltFromDb) - in diesem Fall wäre das Salz natürlich Og. Normalerweise funktioniert Crypt für ein gegebenes Benutzer Passwort gut.

Wenn Dinge schief gehen (und wenn sie es tun, ist es eine dauerhafte Änderung, bis ich Apache neu starte), fand ich, dass crypt anfängt, eine VERSCHIEDENE Antwort für die gleiche Eingabe mit demselben Salz zurückzugeben.

Es ist jedoch konsistent, d. h. wenn das System einmal fehlerhaft ist, gibt crypt die falsche Antwort zurück, gibt aber immer die gleiche falsche Antwort zurück. Wiederholte Aktualisierungen der Seite zeigen dieselbe Ausgabe an. Das gleiche Salz ist auch im neu inkorrekten Crypt-Ergebnis zu sehen, also ist es nicht so, dass das Salz irgendwo verloren gegangen ist.

Wenn ich dann Apache neu starte und das Skript ohne irgendwelche Änderungen neu laufe, dann sind die Ergebnisse von crypt wieder so, wie sie sein sollten.

Ich schätze, es ist nicht das neueste PHP (5.2.8), aber ich würde jede Ansicht darüber schätzen, ob es ein bekannter Bug ist, der in einer späteren Version behoben wurde (das Aktualisieren von PHP ist keine glückliche Aufgabe mit vielen Seiten, die einige noch benutzen unglückliche Macken, die alle mit jedem Upgrade neu getestet werden müssen - wenn es sich um einen bekannten Fehler handelt, dann werde ich natürlich alles so schnell wie möglich aktualisieren, darüber hinaus ist es wahrscheinlich einfacher, die Krypta extern auszulagern, da ich sie nur verwende es an einem gemeinsamen Ort für meine Website.

Jede Eingabe wird geschätzt.

Matt Peddlesden

--- Update: 11. März 2011

Korrektur, um vorher über das Betriebssystem zu kommentieren ...  - Betriebssystem ist Windows Server 2008 SP1 64 Bit. Entschuldigungen, die ich hätte überprüfen sollen, anstatt anzunehmen, ich könnte mich erinnern! Maschine ist ein Dell 2950 8 GB RAM, Xeon-Prozessoren.

Ich fange an, entlang der Linien zu denken, die Krtek vorschlägt - wenn das System verwackelt ist, wenn ich eine neue crypt () erzeuge (dh ein sehr einfaches Beispiel, in dem ich eine Variable auf einen String setze, cryptiere und vergleiche dann mit die Krypta) - alles funktioniert super. Wenn ich den Server neu starte, wird wieder alles auf die vorherigen Berechnungen zurückgesetzt. Ich lehne mich definitiv an etwas an, das den Algorithmus ändert, der zur Berechnung des crypt () -Ergebnisses verwendet wird ... irgendwelche Gedanken darüber, was dazu führen könnte, dass dies geschieht? Ich habe die Werte von CRYPT_STD_DES usw. ausgedruckt und sie ändern sich nicht zwischen Neustarts.

Hat jemand Hinweise darauf, was dazu führen könnte?

Was auch immer gestern an einem Tag zweimal passiert zu sein schien, am seltsamsten.

Danke für die Antworten bis jetzt.

--- Update: 16. März 2011

wollte nur ein weiteres Update zur Verfügung stellen.

Dies geschieht immer noch, immer noch kein weiteres Verständnis warum.

Für den Fall, dass jemand in der Zukunft darüber stolpert, denke ich, dass meine Lösung darin besteht, einen bösen Hack zu machen, um alle Crypt () - Ausführungen auf eine externe C # -Anwendung zu übertragen und auf PHP angewiesen zu sein Mach sie. Irgendwo läuft etwas schief, und an dieser Stelle ist die einzige Lösung, die ich sehen kann, es vollständig aus der Gleichung zu entfernen.

Natürlich, wenn es noch passiert, wird das auch interessant sein! :)

Danke allen.

    
Matt Peddlesden 10.03.2011, 11:11
quelle

4 Antworten

2

Warum liest du das Salz? Und wie bekommst du das Salz? Verschiedene Algorithmen verwenden unterschiedliche Methoden, um das Salz in die Ausgabe einzuschließen.

Verwenden Sie einfach die gesamte Ausgabe der crypt-Funktion als zweites Argument:

%Vor%

Und Single-Pass-DES? Wirklich?

Das letzte Mal, als ich nachgesehen habe, würde die PHP crypt-Implementierung die crypt () - Funktion des Systems aufrufen - wenn es also funktioniert, ist es wahrscheinlich Ihr Betriebssystem als PHP - aber Sie haben nicht gesagt, was Ihr Betriebssystem ist .

    
symcbean 10.03.2011 12:42
quelle
1

Es könnte der Suhosin PHP-Sicherheitspatch sein, der Ihre crypt () Funktion beeinflusst. Es ändert eine Menge der Verschlüsselung / zufällige Methoden und möglicherweise die Ursache für Ihr Problem.

Überprüfen Sie ein phpinfo () und sehen Sie, ob 'suhosin' irgendwo auf der Seite ist. Wenn es da ist, schaue in der php config einige Funktionen davon aus.

    
Dunhamzzz 10.03.2011 11:26
quelle
1

Ich hatte das gleiche Problem mit crypt ... Ich hatte diesen Login-Check auf zwei Servern, aber wenn ich ihn auf den neusten transferiere, hört er irgendwann auf zu arbeiten. Ich laufe mit der md5 Verschlüsselung wie folgt herum: In register.php

%Vor%

Und dann in login.php

%Vor%

Ich hoffe, das hilft:)

    
Belgor 16.08.2013 17:11
quelle
0

Ich hatte das gleiche Problem. Seit dem Verschieben meiner vTigerCRM-Installation auf den lokalen Computer ist die Benutzeranmeldung mit zuvor gespeicherten Kennwörtern fehlgeschlagen. Es scheint, als würde crypt () verschiedene Hashes in verschiedenen Umgebungen mit denselben Argumenten zurückgeben:

In lokaler Umgebung:

%Vor%

In der Produktionsumgebung:

%Vor%     
aliz_bazar 21.08.2011 07:31
quelle

Tags und Links