Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Über Mysql verschlüsseltes Passwort per PHP abfragen

Frage Entwicklung PHP

Mitglied: pcklick

pcklick (Level 1) - Jetzt verbinden

17.10.2014 um 23:46 Uhr, 2528 Aufrufe, 14 Kommentare, 1 Danke

Hallo, ich habe folgendes Problem.
Ich habe User & Passwörter in einer Mysql Datenbank gespeichert. Diese Einträge wurden damals mit folgendem Befehl angelegt:

01.
  
02.
INSERT INTO `datenbank`.`virtual_users` 
03.
(`id`, `domain_id`, `password` , `email`) 
04.
VALUES 
05.
('1', '1', ENCRYPT('passwort-hier-eingeben', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'user-email');
Nun möchte ich eine Login-Abfrage erstellen, doch sobald ich diese ausführe erhalte ich nur einen weissen Screen... Keine Fehlermeldung, nichts...

Die Frage: Wie kann ich das Passwort also so umwandeln, dass es dem verschlüsselten Dateneintrag in der Datenbank entspricht?

Exakt mein Problem hatte auch der User, aber mir konnte die Lösung nicht helfen:
http://stackoverflow.com/questions/16704051/how-to-check-a-mysql-encryp ...

Hier noch meine Login-Datei

01.
if(isset($_POST['send'])) 
02.
{    
03.
    $email = $_POST['user_email']; 
04.
    $password = $_POST['user_password']; 
05.
    $user_email = trim(htmlspecialchars($_POST['user_email'])); 
06.
    $user_password = trim(htmlspecialchars($_POST['user_password'])); 
07.
 
08.
    //Benutzereingaben validieren 
09.
    if(filter_var($user_email, FILTER_VALIDATE_EMAIL) && !empty($user_password)) 
10.
    {
Bis hier her klappte immer alles, nur die folgenden Zeile muss falsch sein:

01.
        $query = $SQL->prepare("SELECT `id` FROM `virtual_users` WHERE `email` = '$email' AND `password` = ENCRYPT('passwort-hier-eingeben', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16)))");
Und ab hier ging auch wieder alles:
01.
        $query->execute(); 
02.
        $query->store_result(); 
03.
        $query->bind_result($user_id); 
04.
 
05.
        //Sind Benutzerdaten vorhanden und korrekt? 
06.
        if($query->num_rows == 1) 
07.
08.
            $query->fetch(); 
09.
            header('location: intern.php'); 
10.
            exit(); 
11.
12.
...
Vielen Dank an alle, die mir helfen wollen! :D
Mitglied: Arano
LÖSUNG 18.10.2014, aktualisiert 24.10.2014
Hallo pcklick,

wegen der "weißen Fehlerseite":
Die Fehlerausgabe ist scheinbar deaktiviert, versuch doch einmal als erste Zeile die folgenden Settings:
01.
ini_set( 'display_errors', 'On' ); 
02.
ini_set( 'error_reporting', E_ALL);
Die sollte 1. die Fehlerausgabe aktivieren (bitte nur auf Testsystemen verwenden) und 2. die Ausgabe auf alle Meldungen einstellen.
Damit sollte deine "weiße Fehlerseite" einer mit PHP-Fehlermeldungen weichen
Tipp: Denke an eigene Fehlerbehandlung ! Wie in diesem Fall. hättest du nach dem ausführen des Querys den Rückgabewert auf Erfolg geprüft, so hättest du die "weiße Fehlerseite" selber abfangen können und einen entsprechenden Hinweis (z.B. Daten konnten nicht ermittelt werden) ausgeben können.
Zudem macht es vom Programm vermutlich auch keinen Sinn weiterzulaufen wenn dei Datenbankabfrage gar nicht erst geklappt hat. (Dies trifft natürlich auf vieles zu: Keine Verbindung zu DB-Server, DB konnte nicht gewählt werden, Query war fehlerhaft, Query lieferte keine Ergebnisse, ect. pp )


Und zum eigentlichen Problem:
Ja, stimmt schon das es an dem Query liegt ! (verwendest du keinen Editor mit Syntaxhighlight !?)
In deinem Query kommt die Zeichenkette "$6$" vor, da sie in doppelten Anführungszeichen (") steht, wird sie von PHP geparst und PHP versucht alle Variablen durch ihre Werte zu ersetzen -> "$6"
Das siehst du auch an dem Syntaxhighlight hier im Forum. "$6" ist in rot geschrieben weil es für eine Variable gehalten wird (wegen dem $). Da es diese Variabel aber nicht gibt, wird sie durch "nichts" ersetzt und zerstört dir so dein Query. (zusättzlich sollte eine PHP-Notice ausgegeben werden... undefinierte Variable oder so etwas in der Art - sofern die Ausgabe nicht deaktiviert ist )

Du kannst nun den Query in einfache Anführungszeichen (') setzen damit er nicht mehr durch PHP geparst wird, ODER die Escapst das(beide/alle) Dollarzeichen = "\$6\$" ...die nicht als Variable dienen.


Schönes Wochenede
~Arano
Bitte warten ..
Mitglied: LordGurke
18.10.2014 um 00:55 Uhr
Zusatz noch dazu:
Warum um alles in der Welt benutzt du PDO::prepare(), und setzt dann die Eingabevariablen UNGEFILTERT(!!) in den Query ein?!
Anstelle der Variablen solltest du dringend entweder die Platzhalter (":platzhaltername") oder das Fragezeichen verwenden!
Bitte warten ..
Mitglied: wiesi200
18.10.2014 um 07:45 Uhr
Hallo,

Ich hätte da noch den Spaß zum beitragen:
http://php.net/manual/de/intro.password.php
Bitte warten ..
Mitglied: pcklick
18.10.2014 um 13:35 Uhr
Zitat von Arano:

Hallo pcklick,

wegen der "weißen Fehlerseite":
Die Fehlerausgabe ist scheinbar deaktiviert, versuch doch einmal als erste Zeile die folgenden Settings:
01.
> ini_set( 'display_errors', 'On' ); 
02.
> ini_set( 'error_reporting', E_ALL); 
03.
> 
Die sollte 1. die Fehlerausgabe aktivieren (bitte nur auf Testsystemen verwenden) und 2. die Ausgabe auf alle Meldungen
einstellen.
Damit sollte deine "weiße Fehlerseite" einer mit PHP-Fehlermeldungen weichen
Tipp: Denke an eigene Fehlerbehandlung ! Wie in diesem Fall. hättest du nach dem ausführen des Querys den
Rückgabewert auf Erfolg geprüft, so hättest du die "weiße Fehlerseite" selber abfangen können
und einen entsprechenden Hinweis (z.B. Daten konnten nicht ermittelt werden) ausgeben können.
Zudem macht es vom Programm vermutlich auch keinen Sinn weiterzulaufen wenn dei Datenbankabfrage gar nicht erst geklappt hat.
(Dies trifft natürlich auf vieles zu: Keine Verbindung zu DB-Server, DB konnte nicht gewählt werden, Query war
fehlerhaft, Query lieferte keine Ergebnisse, ect. pp )



Und zum eigentlichen Problem:
Ja, stimmt schon das es an dem Query liegt ! (verwendest du keinen Editor mit Syntaxhighlight !?)
In deinem Query kommt die Zeichenkette "$6$" vor, da sie in doppelten Anführungszeichen (") steht, wird sie
von PHP geparst und PHP versucht alle Variablen durch ihre Werte zu ersetzen -> "$6"
Das siehst du auch an dem Syntaxhighlight hier im Forum. "$6" ist in rot geschrieben weil es für eine Variable
gehalten wird (wegen dem $). Da es diese Variabel aber nicht gibt, wird sie durch "nichts" ersetzt und zerstört dir
so dein Query. (zusättzlich sollte eine PHP-Notice ausgegeben werden... undefinierte Variable oder so etwas in der Art -
sofern die Ausgabe nicht deaktiviert ist )


Du kannst nun den Query in einfache Anführungszeichen (') setzen damit er nicht mehr durch PHP geparst wird, ODER die
Escapst das(beide/alle) Dollarzeichen = "\$6\$" ...die nicht als Variable dienen.


Schönes Wochenede
~Arano

Vielen Dank für diesen Vorschlag! Ich habe ihn angewendet, doch die if-Abfrage ( if($query->num_rows == 1) ) gibt nicht "1" sonder "0" aus. Demnach wurde die Eingabe in der DB nicht gefunden, obwohl im im Skript selbst nun Mail und Passwort direkt angegeben habe...

Ich vermute immernoch, dass an der Passwort Verschlüsselung etwas nicht stimmt...

01.
$query = $SQL->prepare("SELECT `id` FROM `virtual_users` WHERE `email` = meinemail@domain.ch' AND `password` = ENCRYPT('MEINpasswort!123', CONCAT('\$6\$', SUBSTRING(SHA(RAND()), -16)))");
Liegt es evtl an der RAND() Funktion?
Bitte warten ..
Mitglied: pcklick
18.10.2014 um 13:39 Uhr
Wenn ich nämlich einen weiteren User erstellen möchte mit dem selben Passwort aber einer anderern Mail, ist das Passwort nicht gleich dem, welches beim ersten User eingetragen wurde:

INSERT INTO `datenbank`.`virtual_users`
(`id`, `domain_id`, `password` , `email`)
VALUES
('10', '1', ENCRYPT('selbepasswort-nochmal', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'anderemail@example.com');

Neues Passwort /= Altes Passwort obwohl beide gleich sind...
Bitte warten ..
Mitglied: LordGurke
18.10.2014 um 14:10 Uhr
Klar sind die Passwörter in der DB nicht gleich
Die sind gesalted: http://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html#functi ...

Deshalb muss man die Felder auch beim Abfragen mit DECODE() prüfen:
http://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html#functi ...
Den Salt kannst du dir bei der Abfrage schenken, der wird nur bei der Verschlüsselung benutzt.
Bitte warten ..
Mitglied: colinardo
18.10.2014, aktualisiert um 18:32 Uhr
Hallo zusammen,
Zitat von LordGurke:
Klar sind die Passwörter in der DB nicht gleich
Die sind gesalted:
Korrekt, aber bei jedem Passwort wurde hier ein Hash auf einen Random-Wert als Salt verwendet, den man sich irgendwo hätte sichern müssen um das Passwort später wieder mit dem Hash vergleichen zu können.
Deshalb muss man die Felder auch beim Abfragen mit DECODE() prüfen:
Das geht schon mal garnicht Decode kommt nur bei Verwendung von Encode zum Einsatz !
Den Salt kannst du dir bei der Abfrage schenken, der wird nur bei der Verschlüsselung benutzt.
Eben nicht, er benötigt den beim Verschlüsseln verwendeten Salt um bei der Gegenprüfung einen korrekten Hash-Abgleich machen zu können. Da hier wohl ein Random Salt zum Einsatz kam wird er ohne diesen Salt das Passwort nicht mehr vergleichen können.

Also nochmal für den TO: Bei dieser Variante des Salt hättest du für jeden User das Salt zusätzlich in eine DB sichern müssen; hast du das nicht, kannst du die Passwörter nun leider alle gepflegt in die Tonne kloppen...

Normalerweise verwendet man in diesem Fall z.B. Daten des Users anhand dessen man einen Salt erzeugt( wie z.B. die e-Mail-Adresse ändert sich diese muss natürlich daran gedacht werden das Ursprüngliche Passwort erneut mit den neuen Daten zu Salzen). Diesen Algorythmus muss man dann geheim halten, denn mit diesem lässt sich dann ein wiederholbarer Salt generieren mit dem sich ein reproduzierbarer Hash generieren lässt, ohne das man das Salt irgendwo speichern müsste..

Und noch ein Hinweis: Solltest du die Encrypt() unter Windows verwenden wird diese immer NULL zurückgeben, diese ist nur auf Unix Systemen verwendbar.

Hoffe das war einigermaßen verständlich

Grüße Uwe
Bitte warten ..
Mitglied: LordGurke
18.10.2014 um 17:53 Uhr
Sorry, ich hatte irgendwie auch ENCODE im Hinterkopf... Ja... Kaffe... *kram, such*
Bitte warten ..
Mitglied: pcklick
18.10.2014, aktualisiert um 18:56 Uhr
Zitat von colinardo:

Hallo zusammen,
> Zitat von LordGurke:
> Klar sind die Passwörter in der DB nicht gleich
> Die sind gesalted:
Korrekt, aber bei jedem Passwort wurde hier ein Hash auf einen Random-Wert als Salt verwendet, den man sich irgendwo
hätte sichern müssen um das Passwort später wieder mit dem Hash vergleichen zu können.
> Deshalb muss man die Felder auch beim Abfragen mit DECODE() prüfen:
Das geht schon mal garnicht Decode kommt nur bei Verwendung von Encode zum Einsatz !
> Den Salt kannst du dir bei der Abfrage schenken, der wird nur bei der Verschlüsselung benutzt.
Eben nicht, er benötigt den beim Verschlüsseln verwendeten Salt um bei der Gegenprüfung einen korrekten
Hash-Abgleich machen zu können. Da hier wohl ein Random Salt zum Einsatz kam wird er ohne diesen Salt das Passwort nicht mehr
vergleichen können.

Also nochmal für den TO: Bei dieser Variante des Salt hättest du für jeden User das Salt zusätzlich in eine DB
sichern müssen; hast du das nicht, kannst du die Passwörter nun leider alle gepflegt in die Tonne kloppen...

Normalerweise verwendet man in diesem Fall z.B. Daten des Users anhand dessen man einen Salt erzeugt( wie z.B. die e-Mail-Adresse
ändert sich diese muss natürlich daran gedacht werden das Ursprüngliche Passwort erneut mit den neuen Daten zu
Salzen
). Diesen Algorythmus muss man dann geheim halten, denn mit diesem lässt sich dann ein wiederholbarer Salt generieren
mit dem sich ein reproduzierbarer Hash generieren lässt, ohne das man das Salt irgendwo speichern müsste..

Und noch ein Hinweis: Solltest du die Encrypt() unter Windows verwenden wird diese immer NULL zurückgeben, diese ist
nur auf Unix Systemen verwendbar.

Hoffe das war einigermaßen verständlich

Grüße Uwe

Danke für Deinen Kommentar!
Wie / Mit welchem Befehl speichere ich diesen Salt dann aber ab?
Bitte warten ..
Mitglied: colinardo
LÖSUNG 18.10.2014, aktualisiert 24.10.2014
Zitat von pcklick:
Wie / Mit welchem Befehl speichere ich diesen Salt dann aber ab?
Du generierst dir mit PHP einen reproduzierbaren Salt wie oben beschrieben z.B. mit einem SHA2-Hash der E-Mail-Adresse des Users(bitte komplizierter gestallten, sonst wäre das für Hacker ein leichtes), dann musst du diesen eben nicht abspeichern. Nur wenn du etwas nicht reproduzierbares wie einen randomwert bei der Generierung verwendest musst du dein Salt zusammen mit der UserID am besten in einer anderen DB speichern, da ja RAND() bei jedem mal andere Werte produziert!

Für die Umsetzung lese bitte erst mal:
http://www.foxplex.com/sites/php-passwoerter-sicher-verschluesseln/

Aber wie gesagt an deine jetzigen Passwörter wirst du so nicht mehr herankommen.
Bitte warten ..
Mitglied: pcklick
18.10.2014 um 19:40 Uhr
Das Problem ist nur, dass ich das ganze als SHA512-CRYPT verschlüsseln muss...
Sprich folgendes muss erfüllt sein:

CRYPT_SHA512 - SHA-512 Hash mit einem 16-Zeichen Salt, beginnend mit "$6$"

Mein Frage ist eben, wie ich unter dieser Verschlüsselung, dennoch eine Abfrage des ursprünglichen Passworts per PHP / Mysql machen kann?
Bitte warten ..
Mitglied: wiesi200
18.10.2014 um 19:54 Uhr
Du bekommst das ursprüngliche Passwort nicht mehr raus.
Du kannst nur überprüfen ob das eingegeben dem in der Datenbank entspricht und wie man das macht ist ja schon genannt worden
Bitte warten ..
Mitglied: pcklick
18.10.2014, aktualisiert um 19:56 Uhr
Wie mache ich das aber konkret? Richtig weitergeholfen hat mir das noch nicht so recht ...
Bitte warten ..
Mitglied: colinardo
18.10.2014, aktualisiert um 20:13 Uhr
Zitat von pcklick:

Wie mache ich das aber konkret? Richtig weitergeholfen hat mir das noch nicht so recht ...
http://stackoverflow.com/questions/21711890/how-to-implement-sha-512-md ...

ist doch kein Hexenwerk
...
Bitte warten ..
Ähnliche Inhalte
PHP
PHP MySQL Abfrage aus Datenbank
Frage von Lost144PHP12 Kommentare

Hallo, Ich habe in einer Datenbank daten über VM's stehen. Angaben wie hostname,adresse, serverat usw. Wie kann ich in ...

PHP
PHP - MySQL Abfrage liefert anderes Ergebnis als direkte MySQL (PHP-MyAdmin) Abfrage!
gelöst Frage von FunkerVogtPHP5 Kommentare

Ich denke mal, die Antwort von Euch wird kurz und bündig. Zumindest hoffe ich mit Eurer Hilfe, das Problem ...

PHP
MySQL-Abfrage mit php: Wert + true bzw. false
Frage von tomolpiPHP2 Kommentare

Moin Leute, Frage an die PHP-Experten: mit bekomme ich über data.php?id=123 den passenden Wert, in diesem Fall hans. Da ...

Windows 7
AutoLogon mit verschlüsseltem Passwort?
gelöst Frage von tiny.deluxeWindows 715 Kommentare

Hallo zusammen, ich habe hier einen Windows Server mit Windows 7 Service Pack 1 für den ich ein automatisches ...

Neue Wissensbeiträge
Apple

IOS 11.2.1 stopft HomeKit-Remote-Lücke

Tipp von BassFishFox vor 33 MinutenApple

Das Update für iPhone, iPad und Apple TV soll die Fernsteuerung von Smart-Home-Geräten wieder in vollem Umfang ermöglichen. Apple ...

Windows 10

Windows 10 v1709 EN murkst bei den Regionseinstellungen

Tipp von DerWoWusste vor 5 StundenWindows 10

Dieser kurze Tipp richtet sich an den kleinen Personenkreis, der Win10 v1709 EN-US frisch installiert und dabei die englische ...

Webbrowser

Kein Ton bei Firefox Quantum über RDP

Tipp von Moddry vor 5 StundenWebbrowser

Hallo Kollegen! Hatte das Problem, dass der neue Firefox bei mir auf der Kiste keinen Ton hat, wenn ich ...

Internet

EU-DSGVO: WHOIS soll weniger Informationen liefern

Information von sabines vor 17 StundenInternet4 Kommentare

Wegen der europäische Datenschutzgrundverordnung stehen die Prozesse um die Registrierung von Domains auf dem Prüfstand. Sollte die Forderungen umgesetzt ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
Von rj11 auf rj45
Frage von jensgebkenLAN, WAN, Wireless19 Kommentare

Hallo Gemeinschaft, könnt ihr mir vielleicht bei der anfertigung eines Kabels helfen - habe ein rj 11 stecker und ...

Netzwerkmanagement
Firefox Profieles im Roaming
gelöst Frage von Hendrik2586Netzwerkmanagement17 Kommentare

Hallo liebe Leute. :) Ich hab da ein kleines Problem, welches anscheinend nicht unbekannt ist. Wir nutzen hier in ...

LAN, WAN, Wireless
Häufig Probleme beim Anmelden in WLAN
Frage von mabue88LAN, WAN, Wireless15 Kommentare

Hallo zusammen, in einem Netzwerk gibt es relativ häufig (1-2 mal pro Woche) Probleme mit der WLAN-Verbindung. Zunächst mal ...

Windows Server
Remotesteuerung der Sitzung (Kennung XX) fehlgeschlagen
gelöst Frage von Stefan91Windows Server14 Kommentare

Hallo Zusammen, seit kurzem bekomme ich oben genannte Fehlermeldung, wenn ich versuche eine Remotesitzung über den Taskmanager fernzusteuern (Rechtsklick ...