Beiträge von Campbell

    Für jedes Fahrzeug die Umschaltgeschwindigkeit der Farben bestimmen und dann anhand dieser Daten umschalten. Beispiel:



    new vehicleSpeedArrangement[][] = {
    {50, 100}, // vehicleID 400
    {60, 89}, // vehicleID 401
    //...
    };


    new speed = GetPlayerSpeed(playerid),
    model = GetVehicleModel(GetPlayerVehicleID(playerid));


    if(speed <= vehicleSpeedArrangement[model - 400][0]) {
    // Grün!
    } else if(speed <= vehicleSpeedArrangement[model - 400][1]) {
    // Gelb!
    } else {
    // Rot!
    }

    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.

    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;
    }

    • 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)
    • 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?
    • Deine ersten zwei if-Abfragen sind redundant. Du kannst die erste Abfrage entfernen.
    • Wo sind die ganzen Variablen definiert, u.a engine?
    • Wo ist die Konstante VEHICLE_PARAMS_ON und -OFF definiert und deklariert?
    • Warum verwendest du else if und baust demnach eine weitere if-Abfrage ein? Gibt es noch etwas anderes? else würde doch ausreichen - Performance!

    Wine, WineBottler und Co. sind gut, jedoch nur für kleine Anwendungen. Ich bin mir unsicher, ob es mit GTA: San Andreas gut laufen wird. Das musst du ausprobieren. Aber das ist auch mit Parallels, ... der Fall.

    Deshalb sage ich, lasse dir den kompletten Query ausgeben. Im Logfile wird dir nicht der komplette Query ausgegeben und ist daher nicht fürs Debugging geeignet. Query ausgeben lassen, Probleme am Query suchen, entsprechenden Code überprüfen und Code verbessern.

    Naja, dann beginne doch damit zu debuggen. Lass dir den kompletten Query ausgeben und überprüfe ihn Stück für Stück und gehe dem Problem langsam auf den Grund. Meiner Meinung nach beginnt Debugging jedoch bei einem übersichtlichen Codingstil, denn in einem Wirrwarr ist es erfahrungsgemäß schwerer ein Problem zu lösen als in einem übersichtlichen Stück Code.

    Dein Query zeigt allgemein Schwächen auf, du kannst dir ja mal die entsprechenden Passagen in meinem Tutorial in meiner Signatur anschauen (siehe String-Begrenzer, Mehrzeilig Schreiben, Backticks). Eine gute Schreibweise hilft auch ungemein beim Debugging. Dabei kannst du auch Ressourcen sparen und deine Performance erhöhen, da der jetzige Weg sehr kompliziert und unübersichtlich ist.