Willkommen zu einem kleinen Tutorial von mir!
Ich werde euch in diesem Tutorial das Hashen / Salten von Passwörtern in Datenbanken per Pawn näherbringen.
Das Salten von Passwörtern sorgt heutzutage für mehr Sicherheit bei Datenbankzugriff von fremden Personen.
Beim Salten von Passwörtern wird ein zufällig erstellter Datensatz zum Verschlüsseln der Passwörter verwendet.
Somit wird ein nahezu einzigartiger Hash erstellt, der von Crack Datenbanken nicht aufzufinden werden ist. (Beispiel Cracker)
Nun, man könnte seine Passwörter genau so in SHA Encoden oder andere Encodings verwenden, meiner Meinung nach bringt das Salten aber die meiste Sicherheit.
Auch für SHA gibt es Datenbanken, die für das Cracken von Strings da sind, um eventuelle Passwörter zu finden.
Was benötigt ihr?
- Etwas Ahnung von Pawn und MySQL
- Natürlich wie oben schon genannt, MySQL oder andere Datenbanken (Dieses Tutorial basiert auf MySQL)
- Ein bisschen Verständnis was ihr eigentlich tut
Nun fangen wir doch eigentlich mit dem an was wir benötigen, im sinne von MySQL.
Ihr solltet eine Tabelle mit mindestens 2 Spalten haben für "Password" und "Salt".
Wir überlegen nun, wie können wir denn eigentlich das Passwort mit dem Salt in Verbindung bringen.
Als erstes sollten wir den Salt generieren und allgemein einen Account erstellen lassen.
Das ist der Schritt in dem wir den Salt in der Datenbank speichern und das Passwort sozusagen mit dem Salt verschlüsseln.
Dadurch das wir das eigentliche Passwort garnicht in der Datenbank abspeichern, ist es sozusagen unmöglich das Resultat auszulesen.
Also was benötigen wir für unser Salt? Für mich persönlich reicht es aus einen zufälligen Integer zu verwenden.
Und kommt dabei das Stichwort "random" in den Kopf, eine Pawnfunktion die uns eine zufällige Ganzzahl zurück gibt.
Wir lassen uns also mit einem Dialog ein Fenster anzeigen in dem wir unser "Passwort" angeben und verarbeiten.
if(dialogid == DIALOG_REGISTER){ if(response) { if(strlen(inputtext) > 6) { new Query[256], Salt[64], Password[128]; format(Salt, "%i", random(999999)); //Generieren vom Salt format(Salt, "%s", MD5_Hash(Salt)); //Umwandeln des Salt's in MD5 format(Password, "%s", MD5_Hash(inputtext)); //Passwort in MD5 Hashen format(Password, "%s%s", Salt, Password); //Gehashter Salt und Passwort zusammenfügen format(Password, "%s", MD5_Hash(Password)); //Ingesammt nochmal Hashen mysql_format(Handle, Query, 256, "INSERT INTO users (username, password, salt) VALUES ('%e', '%e', '%e')", Playername(playerid), Password, Salt); mysql_query(Handle, Query, "", ""); //Den Query von oben ausführen } else { SendClientMessage(playerid, -1, "Passwort muss mindestens 6. Zeichen lang sein!"); } } else { Kick(playerid); }}
Wie im Script mit Kommentaren (//) beschrieben, seht ihr was der Code macht. Wir erstellen unseren Salt mit der Funktion "random".
Wir fügen den Salt mit dem Passwort zusammen (MD5(Salt) + MD5(Passwort)) und generieren daraus dann noch einmal den Hash. (MD5(MD5(Salt) + MD5(Passwort))
Das Passwort welches wir mit dem Salt verschlüsselt haben Speichern wir mit dem Salt in die Datenbank.
Wieso Speichern wir den Salt in die Datenbank? Nun, wir müssen ja auch irgendwie wieder den gleichen Salt zur Authentifizierung bekommen.
if(dialogid == DIALOG_LOGIN){ if(response) { if(strlen(inputtext) > 6) { new Query[256], Salt[64], Password[128], Final[128]; mysql_format(Handle, strQuery, 256, "SELECT * FROM users WHERE username='%e' LIMIT 1", Playername(playerid)); mysql_query(Handle, strQuery); //Wir holen uns die Spalten des Users in der Datenbank cache_get_field_content(0, "password", Password, Handle, 128); //Lesen das Gesaltete Passwort aus cache_get_field_content(0, "salt", Salt, Handle, 64); //Lesen unseren Salt aus format(Final, 128, "%s%s", Salt, MD5_Hash(inputtext)); //Fügen unser Salt aus der Datenbank mit dem Passwort vom inputtext zusammen format(Final, 128, "%s", MD5_Hash(Final)); //Hashen es ingesammt if(!strcmp(Password, Final)) { /* Wir haben unser Inputtext mit dem Salt aus der Datenbank zusammen gefügt und Gehasht. Nun sollten wir eigentlich den gleichen Hash bekommen der als "Passwort" in der Datenbank steht. Unser Passwort wird sozusagen garnicht erst abgespeichert sondern komplett gehasht. */ } } else { SendClientMessage(playerid, -1, "Passwort muss mindestens 6. Zeichen lang sein!"); } } else { Kick(playerid); }}
Wir erstellen in dieser Funktion mit unserem Salt aus der Datenbank und unser Inputtext unser Hash der schon in der Datenbank als "Passwort" steht.
Dadurch das der Salt abgespeichert wurde, können wir diesen Verwenden um das gleiche Endprodukt zu bekommen, welches wir bei der Registration hatten. (Das Passwort)
Mit diesem Hash machen wir nun den abgleich ob der selbe auch genau in der Datenbank steht. Tut er es, können wir uns erfolgreich einloggen.
Ich hoffe euch hat das kurze Tutorial gefallen, man sollte es mit etwas Wissen auch ohne Probleme verstehen.
Bitte lass mir doch ein Feedback da, was ich besser machen kann, und wenn ihr Fragen habt, stellt sie einfach.
liebe grüße Grab