Joomla 3.8.1 Hashwerte Passwörter - wie werden sie erstellt?

  • Hallo,


    ich bin absoluter Neuling in Sachen Programmieren, habe auch nur wenig Kenntnisse im Bereich PHP etc. Aber ich habe mir ein ambitioniertes Ziel gesteckt. An einem Punkt komme ich aber nicht weiter und benötige eure Hilfe.


    Mein Plan ist es eine Handy App zu programmieren, die die Inhalte der Joomla Datenbank, in diesem Fall einer Shoutbox, abruft und übersichtlich auf dem Smartphone darstellt. Das funktioniert auch bereits. Ich übergebe alle relevanten Daten an ein PHP Script, welches mir die Datenbank ausliest und der response wird auf dem Endgerät entsprechend ausgewertet. Bislang kann dies aber jeder Benutzer. Keine authentifizierung nötig.....


    Mein Problem liegt bei der Abfrage der Passwörter, die bereits in der Joomla Datenbank als Hashwert abgelegt sind. Ich müsste wissen, nach welchem Verschlüsselungsverfahren Joomla 3.8.1 diese Hashwerte generiert. Ich meine jetzt gefunden zu haben, dass bcrypt verwendet wird......


    Wenn ich aber einen bcrypt Generator bemühe und ein Passwort eingebe, dann stimmt dies nicht mit dem in der Joomla Datenbank gespeicherten Hashwert überein. Wie kann das sein?


    Mein Plan war, die Benutzerdaten der MYSQL Datenbank abzufragen, auf dem Endgerät Benutzername und Passwort eingeben zu lassen, es dann mit demselben Verschlüsselungsverfahren wie Joomla verwendet zu verschlüsseln und zu vergleichen.


    Meine konkreten Fragen:


    1. Welches Verfahren verwendet Joomla 3.8.1 (mit php 7.1) zum erstellen der Hashwerte der Passwörter?
    2. Wenn es bcryt ist, warum bekomme ich immer andere Hashwerte als in der Datenbank?
    3. Ist meine Vorgehensweise, wie ich es beschrieben habe stimmig und richtig?


    Danke für die Hilfe


  • Mein Plan war, die Benutzerdaten der MYSQL Datenbank abzufragen, auf dem Endgerät Benutzername und Passwort eingeben zu lassen, es dann mit demselben Verschlüsselungsverfahren wie Joomla verwendet zu verschlüsseln und zu vergleichen.


    Detailanmerkung: Hashen ist nicht Verschlüsseln, dementsprechend ist bcrypt auch ein Hashverfahren und kein Verschlüsselungsverfahren ;)



    1. Welches Verfahren verwendet Joomla 3.8.1 (mit php 7.1) zum erstellen der Hashwerte der Passwörter?


    Bcrypt, generiert über die password_hash Funktion von PHP: http://php.net/manual/de/function.password-hash.php



    2. Wenn es bcryt ist, warum bekomme ich immer andere Hashwerte als in der Datenbank?


    Zwei Gründe:
    1. kann die Syntax der abgespeicherten Daten (in so einem String ist normalerweise der verwendete Algorithmus, der eigentlicht Hash und der Salt enthalten) unterschiedlich sein
    2. kannst du zwei generierte Hash-plus-Info-Strings (siehe oben) nur dann vergleichen, wenn bei beiden Strings der identische Salt verwendet wurde


    Lange Rede, kurzer Sinn: verwende password_verify zusammen mit password_hash: http://php.net/manual/de/function.password-verify.php



    3. Ist meine Vorgehensweise, wie ich es beschrieben habe stimmig und richtig?


    Das hängt davon ab, wo du den Vergleich durchführst - der sollte (offensichtlich) auf dem Server und nicht in deiner Software auf dem Endgerät stattfinden, aber ich denke das ist klar.

  • Danke, werde mich mal an die Abarbeitung der Infos machen ..... Danke dafür


    Zitat

    as hängt davon ab, wo du den Vergleich durchführst - der sollte (offensichtlich) auf dem Server und nicht in deiner Software auf dem Endgerät stattfinden,


    hmmm, so klar ist mir das nicht. Die Hashwerte (sorry natürlich keine Verschlüsselung :-) ) sind doch nicht zurückrechenbar...... Somit kann ich die doch durch die Gegend schicken wie ich lustig bin, oder? Ich nehme an es geht um das Auswerten ob true oder false? Oder warum muss das unbedingt auf dem Server stattfinden?

  • Danke...... Dieses Script hat funktioniert (ist aus dem Link)



    <?php
    // this will result in 'Invalid Password' as the hash is parsed into 3 variables of


    // due to it being enclosed inside double quotes



    // this will result in 'Password is valid' as variables are not parsed inside single quotes
    $hash = 'HASHWERT AUs DB';


    if (password_verify('KLARTEXT PW', $hash)) {
    echo 'Password is valid!';
    } else {
    echo 'Invalid password.';
    }
    ?>
    Aber wie schaffe ich es jetzt auf meinem Endgerät das Klartext Passwort in den Hashwert zu verwandeln? Ich will ja nicht in Klartext etwas zum Server senden......
    Den SALT Anteil kenn e ich ja nicht, richtig? Den kann ich auch nicht herausbekommen?
    Ich schnalle nicht ganz wie ich ein sicheres Login ohne Übermittlung von Klartext hinbekommen soll....


    Danke nochmal

  • Puh.... jetzt wird es kompliziert glaube ich. KAnnich auf dem Endgerät TLS erzwingen? Und der Server kann das auch?


    Ich glaube fast, das ist alles eine Nummer zu groß für mich.


    Ich habe es jetzt nicht einmal hinbekommen, eine Datenbankverbindung aufzubauen, den Hashwert des entsprehenden Users aus der DB auszulesen und den dann den Hashwert mittels password_verify zu vergleichen. Danach müsste ja dann das Script aufgerufen werden, was die Inhalte aus der DB abruft.


    Das ist alles sehr kompliziert.....


  • absoluter Neuling in Sachen Programmieren...


    Mein Plan ist es eine Handy App zu programmieren, die die Inhalte der Joomla Datenbank, in diesem Fall einer Shoutbox, abruft


    Mein Plan war, die Benutzerdaten der MYSQL Datenbank abzufragen,


    Du solltest dir aber im klaren darüber sein das wenn du auf dem Smartphone eine App installierst in der die Zugangsdaten zur Joomla-Datenbank hinterlegt sind es ein leichtes ist für einen Hacker der an die App kommt diese Zugangsdaten zu extrahieren und damit sich Zugang zu deiner Website und dem gesammten Webspace zu verschaffen! Selbst wenn du diese Zugangsdaten zur Datenbank per TLS vom Webserver erst nach erfolgreicher Authentifizierung in den Arbeitsspeicher des Smartphone überträgst kann prinzipiell jeder der die Authentifizierung "übersteht"an diese Zugangsdaten kommen wenn er ein wenig Hackerkenntnisse besitzt. Wenn du z.B. also einen Benutzer hast der eine unsichere Kombination von Benutzername und Passwort hat oder fahrlässig mit diesen Daten umgeht wäre das dann ein Sicherheitsproblem für deinen gesammten Webspace. usw....

  • Zitat

    Du solltest dir aber im klaren darüber sein das wenn du auf dem Smartphone eine App installierst in der die Zugangsdaten zur Joomla-Datenbank hinterlegt sind es ein leichtes ist für einen Hacker der an die App kommt diese Zugangsdaten zu extrahieren und damit sich Zugang zu deiner Website und dem gesammten Webspace zu verschaffen!


    Derzeit habe ich die Daten, die nötig sind um die Datenbankverbindung aufzubauen, in eine PHP Datei gelegt, die auf dem Server in einem geschützten Verzeichnis (.htaccess) liegt. Diese Datei wird per require_once eingebunden.
    Also die Daten für die Datenbank sind nicht auf dem Endgerät. Was mir aber noch fehlt, ist die Authentifizierung, dass nicht jeder dieses Script zum Auslesen der Datenbank, welches wiederum die Zugangsdaten per require einliest, ausführen kann. Dazu wollte ich ja eine Authentifizierung mit den Benutzerdaten der Joomla Datenbank machen. Oder bin ich falsch gewickelt?


    Zitat

    TLS (https) bekommst du bei den meisten Webspaces, im Gerät musst du das dann einfach über die entsprechende hardcodierte URL sicherstellen. Du fragst User und Passwort im Gerät ab, schickst dass per HTTPS-Request an den Server, verifizierst dort und gibst ein Ergebnis zurück.


    Das heisst also, wenn ich die Seite per

    Code
    1. https://xxxxxx

    aufrufe habe ich automatisch TLS? Muss also bei der Programmierung gar nichts beachten? Außer den request natürlich so aufzubauen? Kann also aus einem Eingabefeld der App im Klartext die Daten übermitteln, vergleiche dann mit password_verify die gesendeten Daten von der App auf dem Server mit den hinterlegten Daten in der Datenbank?


    Oder alles falsch?


  • Das heisst also, wenn ich die Seite per

    Code
    1. https://xxxxxx

    aufrufe habe ich automatisch TLS? Muss also bei der Programmierung gar nichts beachten? Außer den request natürlich so aufzubauen? Kann also aus einem Eingabefeld der App im Klartext die Daten übermitteln, vergleiche dann mit password_verify die gesendeten Daten von der App auf dem Server mit den hinterlegten Daten in der Datenbank?


    Korrekt!

  • Hallo,
    irgendwie stehe ich auf dem Schlauch. Kann mir da mal jemand helfen?


    Ich versuche mein Konstrukt noch einmal so gut wie möglich zu erklären.
    In einem per .htaccess geschützen Verzeichnis liegt eine Datei, die die Zugangsdaten für die MysQLi Datenbank hat. Diese wird in die Datei, die meine eigentlichen Datenbankinhalte abruft per require_once eingebunden. Also keine MYSQL Zugangsdaten auf dem Endgerät


    Damit müsste ich doch dann eigentlich erstmal den Hashwert des Passwortes des entsprechenden Users auslesen. Den Usernamen müsste ich ja vorher per POST an das Script übergeben, damit entsprechend nachgesehen werden kann, um wen es gerade geht.


    Wenn der Hashwert denn ausgelesen wurde, muss ich noch den im Smartphone eingegebenen ( und per POST übermittelten) Benutzernamen und Klartextpasswort mit password_verify überprüfen und wenn OK dann den Inhalt einer anderen Tabelle (meine eigentlichen Daten) an das Smarthone übergeben (Rückgabewert des https Request).


    Wäre es denkbar mir ein entsprechenden Code Schnipsel zur Verfügung zu stellen? Ich kapiere das irgendwie nicht. Letztenendes könnte ich sogar die Hashwerte vom Smartphone mitsenden, da es nur ca 20 Benutzer sind (also in der App für jeden User hinterlegen). Aber das wäre ja im Falle einer Passwortänderung im Joomla System nicht sehr Benutzerfreundlich.


    Ich weiß mitlerweile auch, dass ich Code Injections usw. verhindern muss. Aber darum würde ich mich im Anschluss kümmern. Damit das alles nicht zu unübersichtlich wird, wäre es schön, wenn davon erstmal abgesehen werden könnte.


    Es ist einfach zu verwirrend für mich


    Danke

  • Hi nochmal,


    ich habe im Netz nachfolgenden Code gefunden. Verstehe ihn allerdings nicht. Könnte mir da jemand Hilfestellung geben? Bekomme das nicht zu laufen. Vor allem die beiden require_once Befehle verursachen wohl Probleme. Gibt es defines.php und framewrok.php immer automatisch bei jeder Insatllation?


    Eignet sich der Code überhaupt für mein Vorhaben?


    Danke soweit





    Edit by Admin: Langen Code in Spoiler (Forenregeln)