Wo hashe ich das Passwort jetzt hier?

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • case DIALOG_REGISTER2:
    {
    if(!response) return SendClientMessage(playerid,ROT,"Aufwiedersehen."), Kick(playerid);
    else
    {
    if(strlen(inputtext)<6) return ShowPlayerDialog(playerid,DIALOG_REGISTER2,DIALOG_STYLE_PASSWORD,#SERVERFARBE#SERVERNAME":{FFFFFF} Registration","{FFFFFF}Das von dir eingegebene Passwort ist zu kurz. Es muss mindestens "#SERVERFARBE"6{FFFFFF} Zeichen lang sein.","Weiter","Abbrechen");
    else if(strlen(inputtext)>32) return ShowPlayerDialog(playerid,DIALOG_REGISTER2,DIALOG_STYLE_PASSWORD,#SERVERFARBE#SERVERNAME":{FFFFFF} Registration","{FFFFFF}Das von dir eingegebene Passwort ist zu lang. Es darf maximal "#SERVERFARBE"32{FFFFFF} Zeichen lang sein.","Weiter","Abbrechen");
    else
    {
    new pass[MAX_PASSWORD_SIZE];
    mysql_escape_string(inputtext,pass,sqlconnection);
    Spieler[playerid][pPassword]=pass;
    ShowPlayerDialog(playerid,DIALOG_REGISTER3,DIALOG_STYLE_MSGBOX,#SERVERFARBE#SERVERNAME":{FFFFFF} Registration","{FFFFFF}Merke dir dein Passwort gut und gib es an niemanden weiter.\nDu bist für deinen Account selbst verantwortlich.","Weiter","Abbrechen");
    }
    hier
    }
    }


  • Beim registrieren speicherst du es in der Datenbank. Und bei Login fragst du ab, ob das angegebene Passwort mit dem in der Datenbank übereinstimmt. Mir fällt kein wirklicher Grund ein, warum man sonst noch das Passwort brauchen würde, also ist es eigentlich unnötig das in einer Variable zu speichern.

    The fact is, I am right. And if you think I'm wrong, you are wrong.

    • Was ist dein Grund MD5 zu verwenden? Warum verwendest du nicht einen anderen Hash?
    • Man speichert nie ein Passwort in einer Variable aus Sicherheitsgründen. Ein Passwort wird nur kurzzeitig verwendet und danach wieder gelöscht.
    • Ein Hash alleine bringt nicht viel. Hast du schonmal an Salts gedacht? Evt. auch an einen Salt aus Script + einen individuellen pro User aus der Datenbank, sodass man beide Salts braucht und demnach Script + Datenbank?
    • MD5 hashs sind schon überall im Web in Datenbanken gespeichert und können in wenigen Sekunden in das Passwort umgeformt werden. Auch bestehen bei MD5 Kollisionen. Verwende es einfach nicht, dann hast du damit keine Probleme. Gegen Rainbow-Tables hilft dir der Salt unten (Eventuell solltest du zu Whirlpool greifen oder vielleicht auch einen Umweg über PHP gehen oder ein Plugin schreiben).
    • Man kann die Sicherheit nicht mit Variablen erhöhen. Was maddin bereits sagte: Man speichert das Passwort nicht, d.h. man lässt es nicht im Arbeitsspeicher, denn dort könnte es ausgelesen werden. Also: Aus der Datenbank holen, Login Prozedur durchlaufen, Variable aus dem Arbeitsspeicher löschen (In Pawno einfach nicht global speichern und lokale Variable verfallen lassen).
    • Salts (ein Überblick, du solltest googlen und dich einlesen): http://de.wikipedia.org/wiki/Salt_(Kryptologie)
  • Ich würde dir persönlich Whirpool empfehlen, benutze ich auch. Warum man auf MD5 verzichten sollte, hat Campbell schon erwähnt.
    Von Salts habe ich zwar gehört, jedoch nur flüchtig. Habe mich mal schlau gemacht und diesen Thread hier gefunden http://forum.sa-mp.com/showthread.php?t=350664
    Ein Tutorial wie man Passwörter und andere wichtige Sachen saltet.
    Werde das wohl auch benutzen, danke Campbell:

  • Du speicherst weiterhin das Passwort global, du verwendest weiterhin MD5 und verwendest weiterhin keine Salts. Ich dachte dir leuchten meine 3 Punkte ein? Ein Beispiel (Hier im Editor verfasst, kann Fehler enthalten!):


    /* Dateikopf */
    #include <a_samp>


    #define PEPPER "J25NM?=5A)"


    native WP_Hash(buffer[], len, const str[]);



    /* Account-Erstellung unter Annahme, dass inputtext das eingegebenen Passwort enthält. */


    new hash[129],
    userSalt[11];


    format(userSalt, 11, "%s", generateUniqueKey());
    format(hash, 129, "%s%s%s", PEPPER, inputtext, userSalt);
    WP_Hash(hash, 129, hash);
    // Nun Passwort + userSalt in zwei Feldern in der Datenbank speichern und fertig. Passwort nicht global speichern!



    /* Loginprozedur unter Annahme, dass inputtext das eingegebenen Passwort enthält. */


    new password[129],
    hash[129],
    userSalt[11];


    // Hier Passwort + userSalt aus Datenbank auslesen!
    format(hash, 129, "%s%s%s", PEPPER, inputtext, userSalt);
    if(strcmp(hash, password, false) == 0) {
    // Login erfolgreich - User einloggen und Passwort nicht global speichern!
    } else {
    // Login fehlgeschlagen - User nicht einloggen und Passwort nicht global speichern. Ggf. User kicken/warnen!
    }



    /* Funktionen */


    generateUniqueKey() {
    new key[11];
    for(new i = 0; i < 11; i++) {
    key[i] = random(93) + 33;
    }


    return key;
    }

  • Ich denke MD5 (evtl. in Kombination mit Salt / Pepper) reicht vollkommen aus. Alternativ könnte man auch SHA nehmen, beides liefert MySQL ja praktisch schon mit, weshalb man sich da zusätzliche Umstände sparen kann wenn man MySQL das Erledigen lässt.
    Whirlpool ist zwar ne tolle Sache, aber in der Datenbank eines SA-MP Servers werden wohl kaum relevante Daten gespeichert die es für einen Angreifer interessant machen würden da viel mühe rein zu stecken. Von daher M.M.n ein wenig zu viel des guten.


    Ausserdem: Konstanten werden in der Regel immer Groß geschrieben, und das was du da beschrieben hast ist ein Pepper und kein Salt :p

    The fact is, I am right. And if you think I'm wrong, you are wrong.

  • Ich denke MD5 (evtl. in Kombination mit Salt / Pepper) reicht vollkommen aus. Alternativ könnte man auch SHA nehmen, beides liefert MySQL ja praktisch schon mit, weshalb man sich da zusätzliche Umstände sparen kann wenn man MySQL das Erledigen lässt.
    Whirlpool ist zwar ne tolle Sache, aber in der Datenbank eines SA-MP Servers werden wohl kaum relevante Daten gespeichert die es für einen Angreifer interessant machen würden da viel mühe rein zu stecken. Von daher M.M.n ein wenig zu viel des guten.


    Ausserdem: Konstanten werden in der Regel immer Groß geschrieben, und das was du da beschrieben hast ist ein Pepper und kein Salt :p


    Habe ich verbessert, danke für das Feedback. Daran, dass MySQL das kann, hatte ich gerade garnicht gedacht, guter Tipp. Beim Login-Prozess wird man jedoch wieder das Plugin benötigen, vielleicht sollte man sich dann doch direkt für den Plugin entscheiden, damit man nicht das gleiche auf mehreren verschiedenen Wegen löst und es simple hält (KISS Verfahren), aber das obliegt dem Programmierer. Auch die Wahl des Hashs obliegt dem Programmierer, wobei ich denke, dass man leicht direkt etwas besseres wählen könnte, wenn es das schon gibt (bzgl. der Kollisionen - wieso diese Gefahr eingehen, wenn man sie vermeiden kann auch wenn sie wahrscheinlich nicht eintreten wird?). Salt, Pepper, Whirlpool/SHA - das ist mein Tipp für nun, aber da gibt es verschiedene Ansichten je nach Programmierer. Zu viel der Mühe? Naja, meiner Meinung nach schaden die zwei Zeilen Code mehr nicht unbedingt. Aber das muss jeder für sich entscheiden. Bei SA:MP wahrscheinlich weniger wichtig als bei Webseiten und Co. aber wie gesagt, das muss jeder für sich entscheiden.

  • Beim Login-Prozess wird man jedoch wieder das Plugin benötigen

    Nicht unbedingt. Wie gesagt, MySQL kann das ja von Hause aus schon:

    SQL
    SELECT EXISTS( SELECT * FROM `users` WHERE `name` = 'Campbell' AND `password` = md5( CONCAT( '_PEPPER_', 'super geheimes passwort' ) ) LIMIT 1 )


    Wenn noch ein Salt dazu kommt musst du zwar noch etwas hinzufügen, ist aber trotzdem ohne extra include/plugin/function/whatever machbar.
    Bei dem Rest gebe ich dir allerdings recht.