Brauchst du noch einen Vserver?
Ich habe selber einen, aber danke
Tut mir leid, das Topic stoßen ...
Wie dieses Skript zu bekommen?
Was bietest du ?
Brauchst du noch einen Vserver?
Ich habe selber einen, aber danke
Tut mir leid, das Topic stoßen ...
Wie dieses Skript zu bekommen?
Was bietest du ?
ZitatBitte besuche die Website in einigen Stunden erneut. Eventuell ist sie dann wieder verfügbar!
Ein anderes Projekt von mir hat den Webhoster überlastet, weswegen mein Webspace gesperrt wurde
Würde eventuell noch ein bisschen mehr Sicherheit einbauen in Deine Queries. Aber sonst sieht es schonmal sehr gut aus
Weiterhin wünsch ich Dir viel Erfolg
Ich hatte ja geschriebe, dass das schematisch ist
Ich überprüfe alle Werte natürlich, bevor ich sie in Querys einbaue
Aber danke
Okay, noch mal eindeutig klären
Wie man sieht, nicht mal ein load von 0,2 und die CPU dadelt bei nicht mal 20% rum
Und bevor es heißt, ich würde unsauber auf die DB zugreifen, genau das tue ich nicht, sondern benutze verknüpfte Statements
SELECT * FROM categories WHERE id = %d$query = mysql_query()if(mysql_num_rows()){ $categorie = mysql_fetch_assoc($query); SELECT * FROM threads WHERE id = %d $query = mysql_query($sql); if(mysql_num_rows()) { $thread = mysql_fetch_assoc($query); echo Du bist hier: $categorie['name'] > $thread['name']; }}
SELECT categorie.name AS `categorie`, threads.name AS `thread` FROM categories, threds WHERE categorie.id = thread.categorie AND thread.id = %s$query = mysql_query();if(mysql_num_rows()){ $stats = mysql_fetch_assoc($query); echo Du bist hier: $categorie['categorie'] > $thread['thread'];}
Es gab gerade einen heftigen Börsencrash, nachdem @Mr.Toast mir geraten hat, in Aktien zu investieren
@Mr.Toast, dafür sende ich deinem Clan eine Kriegserklärung
Unbekannter Hostname: tion.pf-control.de - weiche nicht vorhanden.
Sollte jetzt wieder gehen
Da sind Dateien drauf, welche nicht für jeden zugänglich sein sollten. -.-
Sind alte Access-Logs, habe sie trotzdem mal gelöscht
Ach ja, ich glaube, ich habe es hier noch nicht angesprochen, aber ihr könnt jetzt auch das Design wechseln :O
Zur Auswahl stehen einfach das Retro-Design oder ein noch hässlicheres anderes, wenn meine 3 Leute fertig sind, bekommt ihr noch 3 weitere
time()+7200?
Das ist dir für mein tägliches Einkommen...
Deine wollte ich noch auf (time() * 3.1415)^0 ändern
Ist ein vServer von Alvotech.de
Jep, und die Techniker antworten mir nicht
Habe -selbst als Root- keinen Zugriff auf Datum & Uhrzeit
Formeln versuche ich, so viel wie es geht, geheim zu halten, damit ihr bald nicht alle mit dem Taschenrechner vor dem Computer/Handy hockt
Okay, noch mal in ein paar Minuten neuladen
Liegt daran, dass der Zertifikat nicht richtig installiert ist, und ich bei FB die alte DB nutze...
Musst du einfach bestätigen, stimmt eigentlich
Finde ich gut, aber wieso ist das zeug auf Englisch Teilweise ?
Weil ich es eigentlich zuerst in Englisch schreiben wollte, mich mittendrin umentschieden habe und ich eigentlich generell Englisch bei Variablen, Funktionen, ... nutze
@^Obermann: Danke
kriege eh 16.000 am Tag.. xD
Süß
Seite neugeladen: ERR_WRONG_SESSION_HASHSUM
Kann eigentlich nach neuladen nicht sein, weil der Code zum testen des Loginins und der Konsole gleich sind...
Nutzt du FB oder Standalone ?
//Edit2: Danke Mr.Tion, 37 Yen -....- von 25.000 -.-
Ingame heiße ich nur "Tion"...
37 Yen nur ? Ich meine, der Hack vorher waren etwa 13k... Oder warst das nicht du ?
Ja, aber dazu muss ich doch die IP kennen oder nicht ? Weil wenn ich scan mache dann muss
ich eine IP eingeben ...
Nein, bei scan musst du ein Subnetz eingeben, dass du rätst.
So kannst du z.B. "scan 127.0.0.*" eingeben, und er zählt bei den * immer höher, guckt ob die IP existiert und gibt ja/nein zurück.
Wenn dein Script hoch genug ist, kannst du auch "scan 127.*.*.*" eingeben, und er findet alle IP's, die mit 127 anfangen.
In dem Code selber zählt er nicht hoch, das war ein Beispiel
Konsole geht nicht bei mir Error Hash Session, oder so ähnlich
Wenn es "ERR_WRONG_SESSION_HASHSUM" ist, lade mal die gesammte Seite neu
Wie wird versichert das du die Dateien nirgends speicherst? Oo
Das ist in der Tat schwierig zu beweisen... Reichen dir meine Beitragszahlen ?
Ich weiß gar nicht wie man die überhaupt finden kann ?! xD
In der Konsole "install scanner"
Dann kannst du scannen
Hey Leute,
sicherlich kennt der eine oder andere Webentwickler das Problem, dass man eine Software entwickelt hat und sie ausgeben möchte, jedoch meistens keine Lust hat, dass alle sich aus dem Sourcecode bedienen.
In den letzten Tagen habe ich mich mal an Code-Obfuscation gemacht, was in etwa das "verschleiern von Code" ist. Das bedeutet, dass er für Menschen nur noch sehr schwer zu lesen ist - als Beispiel habe ich mal eine Klasse genommen und sie verschleiert:
// WICHTIGE ANMERKUNG - In dem echten obfuscierten Text steht PHP-Code in 1 Zeile, aus übersichtsgründen ist das hier jetzt eingerückt.<?phpclass c2690851a1 { private $v317d37b0e = null; private $vcf1e8c14e = null; private $v901555fb0 = null; public function __construct($vcf1e8c14e, $v901555fb0=7777 ) { $this-> vcf1e8c14e = $vcf1e8c14e; $this-> v901555fb0 = $v901555fb0; $this-> v317d37b0e = fsockopen("udp://" .$this-> vcf1e8c14e, $this-> v901555fb0, $v8f90f2980, $vfa5389291, 2 ); socket_set_timeout($this-> v317d37b0e, 2 ); } public function fbced893c4() { @fwrite($this-> v317d37b0e, $this-> feb5c2d1d1("i" )); fread($this-> v317d37b0e, 11 ); $v2d5e1b562 = array (); $v2d5e1b562['password' ] = (integer) ord(fread($this-> v317d37b0e, 1 )); $v2d5e1b562['players' ] = (integer) $this-> f9f7fa7b15(fread($this-> v317d37b0e, 2 )); $v2d5e1b562['maxplayers' ] = (integer) $this-> f9f7fa7b15(fread($this-> v317d37b0e, 2 )); $ve1b5fe1db = ord(fread($this-> v317d37b0e, 4 )); if (!$ve1b5fe1db) return -1 ; $v2d5e1b562['hostname' ] = (string) fread($this-> v317d37b0e, $ve1b5fe1db); $ve1b5fe1db = ord(fread($this-> v317d37b0e, 4 )); $v2d5e1b562['gamemode' ] = (string) fread($this-> v317d37b0e, $ve1b5fe1db); $ve1b5fe1db = ord(fread($this-> v317d37b0e, 4 )); $v2d5e1b562['map' ] = (string) fread($this-> v317d37b0e, $ve1b5fe1db); return $v2d5e1b562; } public function f8949d0673() { @fwrite($this-> v317d37b0e, $this-> feb5c2d1d1("c" )); fread($this-> v317d37b0e, 11 ); $v17f1559ab = ord(fread($this-> v317d37b0e, 2 )); $va2bbabfe7 = array (); if ($v17f1559ab > 0 ) { for ($v865c0c0b4 = 0 ; $v865c0c0b4 < $v17f1559ab; ++ $v865c0c0b4) { $ve1b5fe1db = ord(fread($this-> v317d37b0e, 1 )); $va2bbabfe7[$v865c0c0b4] = array ( "name" => (string) fread($this-> v317d37b0e, $ve1b5fe1db), "score" => (integer) $this-> f9f7fa7b15(fread($this-> v317d37b0e, 4 )), ); } } return $va2bbabfe7; } public function ff1133985a() { @fwrite($this-> v317d37b0e, $this-> feb5c2d1d1("d" )); fread($this-> v317d37b0e, 11 ); $v17f1559ab = ord(fread($this-> v317d37b0e, 2 )); $va2bbabfe7 = array (); for ($v865c0c0b4 = 0 ; $v865c0c0b4 < $v17f1559ab; ++ $v865c0c0b4) { $v912af0dff['playerid' ] = (integer) ord(fread($this-> v317d37b0e, 1 )); $ve1b5fe1db = ord(fread($this-> v317d37b0e, 1 )); $v912af0dff['nickname' ] = (string) fread($this-> v317d37b0e, $ve1b5fe1db); $v912af0dff['score' ] = (integer) $this-> f9f7fa7b15(fread($this-> v317d37b0e, 4 )); $v912af0dff['ping' ] = (integer) $this-> f9f7fa7b15(fread($this-> v317d37b0e, 4 )); $va2bbabfe7[$v865c0c0b4] = $v912af0dff; unset ($v912af0dff); } return $va2bbabfe7; } public function fb62d56475() { @fwrite($this-> v317d37b0e, $this-> feb5c2d1d1("r" )); fread($this-> v317d37b0e, 11 ); $vca703ee63 = ord(fread($this-> v317d37b0e, 2 )); $va4f86f7bf = array (); for ($v865c0c0b4 = 0 ; $v865c0c0b4< $vca703ee63; ++ $v865c0c0b4) { $ve1b5fe1db = ord(fread($this-> v317d37b0e, 1 )); $v981c1e7b3 = (string) fread($this-> v317d37b0e, $ve1b5fe1db); $ve1b5fe1db = ord(fread($this-> v317d37b0e, 1 )); $va4f86f7bf[$v981c1e7b3] = (string) fread($this-> v317d37b0e, $ve1b5fe1db); } return $va4f86f7bf; } public function f213ecff1a() { $vdf911f015 = 0 ; $vceb172632 = microtime(true); @fwrite($this-> v317d37b0e, $this-> feb5c2d1d1("r" )); fread($this-> v317d37b0e, 15 ); $va745d640f = microtime(true); $vdf911f015 = ($va745d640f - $vceb172632) * 1000 ; return round($vdf911f015); } private function f9f7fa7b15($vb45cffe08) { if ($vb45cffe08 === "" ) { return null; } $vfa7153f7e = 0 ; $vfa7153f7e += (ord($vb45cffe08[0 ])); if (isset ($vb45cffe08[1 ])) { $vfa7153f7e += (ord($vb45cffe08[1 ]) < < 8 ); } if (isset ($vb45cffe08[2 ])) { $vfa7153f7e += (ord($vb45cffe08[2 ]) < < 16 ); } if (isset ($vb45cffe08[3 ])) { $vfa7153f7e += (ord($vb45cffe08[3 ]) < < 24 ); } if ($vfa7153f7e > = 4294967294 ) { $vfa7153f7e -= 4294967296 ; } return $vfa7153f7e; } private function feb5c2d1d1($v599dcce29) { $v9c509e44d = "SAMP" ; $v9c509e44d .= chr(strtok($this-> vcf1e8c14e, "." )); $v9c509e44d .= chr(strtok("." )); $v9c509e44d .= chr(strtok("." )); $v9c509e44d .= chr(strtok("." )); $v9c509e44d .= chr($this-> v901555fb0 & 0xFF ); $v9c509e44d .= chr($this-> v901555fb0 > > 8 & 0xFF ); $v9c509e44d .= $v599dcce29; return $v9c509e44d; } public function fb640a0ce4() { $v06aa6fa8b = false; fwrite($this-> v317d37b0e, $this-> feb5c2d1d1("p0101" )); if (fread($this-> v317d37b0e, 10 )) { if (fread($this-> v317d37b0e, 5 ) == 'p0101' ) { $v06aa6fa8b = true; } } return $v06aa6fa8b; } public function f716f6b305() { @fclose($this-> v317d37b0e); }}
Wer jetzt auf Anhieb errät, was die Klasse macht, ist gut
<?php/** * * @author Edward McKnight (EM-Creations.co.uk) *//* *****************************************************************// SampQuery.class.php// Version 1.0// This class connects to a specific SA-MP server via sockets.// Copyright 2012 Edward McKnight (EM-Creations.co.uk)// Creative Commons Attribution-NoDerivs 3.0 Unported License// http://creativecommons.org/licenses/by-nd/3.0/// Credits to Westie for the original PHP SA-MP API and inspiration for this API.* *****************************************************************/$query = new SampQuery("server.life-of-german.org", 7777);if($query->connect()) echo'Server online';else echo'Server offline';class SampQuery { private $sock = null; private $server = null; private $port = null; /** * Creates a new SampQuery object. * @param $server server hostname * @param $port port of the server */ public function __construct($server, $port=7777) { $this->server = $server; $this->port = $port; $this->sock = fsockopen("udp://".$this->server, $this->port, $errorNum, $errorString, 2); socket_set_timeout($this->sock, 2); } /** * Returns an array of server information. * @return Array[] * ( * [password] => 0 or 1 * [players] => players * [maxplayers] => maxPlayers * [hostname] => hostName * [gamemode] => gamemode * [map] => map * ) */ public function getInfo() { @fwrite($this->sock, $this->assemblePacket("i")); fread($this->sock, 11); $serverInfo = array(); $serverInfo['password'] = (integer) ord(fread($this->sock, 1)); $serverInfo['players'] = (integer) $this->toInt(fread($this->sock, 2)); $serverInfo['maxplayers'] = (integer) $this->toInt(fread($this->sock, 2)); $strLen = ord(fread($this->sock, 4)); if(!$strLen) return -1; $serverInfo['hostname'] = (string) fread($this->sock, $strLen); $strLen = ord(fread($this->sock, 4)); $serverInfo['gamemode'] = (string) fread($this->sock, $strLen); $strLen = ord(fread($this->sock, 4)); $serverInfo['map'] = (string) fread($this->sock, $strLen); return $serverInfo; } /** * Returns a multidimensional array of basic player information. * @return Array[] * ( * [0] => Array[] * ( * [name] => playerName * [score] => score * ) * ... * ) * @see getDetailedPlayers() */ public function getBasicPlayers() { @fwrite($this->sock, $this->assemblePacket("c")); fread($this->sock, 11); $playerCount = ord(fread($this->sock, 2)); $players = array(); if($playerCount > 0) { for($i = 0; $i < $playerCount; ++$i) { $strLen = ord(fread($this->sock, 1)); $players[$i] = array ( "name" => (string) fread($this->sock, $strLen), "score" => (integer) $this->toInt(fread($this->sock, 4)), ); } } return $players; } /** * Returns a multidimensional array of detailed player information. * @return Array[] * ( * [0] => Array * ( * [playerid] => playerid * [nickname] => playername * [score] => score * [ping] => pinh * ) * ... * ) * @see getBasicPlayers() */ public function getDetailedPlayers() { @fwrite($this->sock, $this->assemblePacket("d")); fread($this->sock, 11); $playerCount = ord(fread($this->sock, 2)); $players = array(); for($i = 0; $i < $playerCount; ++$i) { $player['playerid'] = (integer) ord(fread($this->sock, 1)); $strLen = ord(fread($this->sock, 1)); $player['nickname'] = (string) fread($this->sock, $strLen); $player['score'] = (integer) $this->toInt(fread($this->sock, 4)); $player['ping'] = (integer) $this->toInt(fread($this->sock, 4)); $players[$i] = $player; unset($player); } return $players; } /** * Returns an array of server rules. * @return Array[] * ( * [gravity] => gravity * [mapname] => map * [version] => version * [weather] => weather * [weburl] => weburl * [worldtime] => worldtime * ) */ public function getRules() { @fwrite($this->sock, $this->assemblePacket("r")); fread($this->sock, 11); $ruleCount = ord(fread($this->sock, 2)); $rules = array(); for($i = 0; $i< $ruleCount; ++$i) { $strLen = ord(fread($this->sock, 1)); $rule = (string) fread($this->sock, $strLen); $strLen = ord(fread($this->sock, 1)); $rules[$rule] = (string) fread($this->sock, $strLen); } return $rules; } /** * Returns the server's ping. * @return integer */ public function getPing() { $ping = 0; $beforeSend = microtime(true); @fwrite($this->sock, $this->assemblePacket("r")); fread($this->sock, 15); $afterReceive = microtime(true); $ping = ($afterReceive - $beforeSend) * 1000; return round($ping); } private function toInt($string) { if($string === "") { return null; } $int = 0; $int += (ord($string[0])); if(isset($string[1])) { $int += (ord($string[1]) << 8); } if(isset($string[2])) { $int += (ord($string[2]) << 16); } if(isset($string[3])) { $int += (ord($string[3]) << 24); } if($int >= 4294967294) { $int -= 4294967296; } return $int; } private function assemblePacket($type) { $packet = "SAMP"; $packet .= chr(strtok($this->server, ".")); $packet .= chr(strtok(".")); $packet .= chr(strtok(".")); $packet .= chr(strtok(".")); $packet .= chr($this->port & 0xFF); $packet .= chr($this->port >> 8 & 0xFF); $packet .= $type; return $packet; } /** * Attempts to connect to the server and returns whether it was successful. * @return boolean */ public function connect() { $connected = false; fwrite($this->sock, $this->assemblePacket("p0101")); if(fread($this->sock, 10)) { if(fread($this->sock, 5) == 'p0101') { $connected = true; } } return $connected; } /** * Closes the connection */ public function close() { @fclose($this->sock); }}
Das beste daran ist, dass das Script / die Webseite dadurch nicht langsamer und die Dateien kleiner wird - ersteres, weil ja nur alle Variablen und Funktionen umbenannt werden, zweiteres, weil Kommentare und unnötiger Whitespace ( wie Einrückungen ) verschwinden.
URL zum Obfuscator: https://apps.tionsys.de/encode/
Wer mir nicht traut, darf gerne auch die halb-offline-Version aus Java benutzen
Sie ist aber noch Alpha und ich konnte sie noch nicht ausreichend testen - deswegen bitte ich euch, Bugs zu berichten
Update: Die Beta-Version hat nun auch einen Dialog und unterstützt Multi-Threading, was das ganze noch etwas schneller macht.
Auch kann er nebenbei den CSS-Code etwas "schrumpfen" & verschleiern, indem Kommentare und Whitespace entfernt werden.
Erlaubnis von Trooper, den Source-Code unter Verschluss zu halten
Bitte feedbacken, aber nicht trollen - und wer sagt, Ioncube ist besser, dem gebe ich eine Kopfnuss
Hey Leute,
ich wollte euch ganz kurz in die Basics der Kryptologie einführen, da scheinbar einige das mit den Passwörtern noch nicht verstanden haben
Erst einmal klären wir ein paar Fachbegriffe:
Einwegfunktionen
Eine "echte" Einwegfunktion verändert einen Wert und lässt ihn (offiziell) nicht wieder zurückrechnen
Ein (schlechtes) Beispiel ist z.B.
Aus dem alten Wert lässt sich ruck-zuck ein neuer Wert berechnen, anders herum kann es zu Schwierigkeiten kommen und man müsste mit Raten anfangen...
Für die, die mir nicht glauben: neuerwert = 4,3125 Wer das zurückrechnet, dem schicke ich per Post einen Lollie
Einwegfunktionen mit Falltür In diesem Beispiel: Public-Key-Verfahren
Nun gibt es einige Einwegfunktionen, die man doch zurückrechnen kann, aber nicht so, wie man sie berechnet hat.
Das mag jetzt kompliziert klingen (ist es auch), aber ich stelle das mal bildlich da, erkläre das dann danach:
Ein tägliches Beispiel davon, und genau davon, finden wir täglich: HTTP mit SSL ( https )
Beim Public-Key-Verfahren gibt es einen Public-Key und einen Private-Key. Der Public-Key ist öffentlich bekannt und das Schloss der Kassette, der Private-Key der Schlüssel.
Hash
Ein Hash ist eine Einwegfunktion. Das bedeutet, man kann ihn nicht zurückberechnen, man kann aber "probieren"
Salts ( Salz )
Salts sind noch mal ein Aufsatz auf den Hash, weil dabei 2 "Passwörter" existieren - eines wird vom Server bei der ersten Erstellung des Accountes erstellt, das andere kommt von Benutzer.
Dann werden beide aneinander gehängt und gehasht. Davon der Hash und der Salt werden gespeichert.
Beispiel:
Benutzerpasswort: helloworld
Salt: kdbjyhbfdxkjyhxdbkjsf
Vor dem Hash: helloworldkdbjyhbfdxkjyhxdbkjsf
Gehasht: hdhggksdhfmkfudjdyuhglgfj
Gespeichert wird der Salt und "Gehasht", dann wird das jedes mal neu zusammengesetzt.
Der Vorteil von Salts liegt darin, dass ein (hoffentlich nicht) Hacker die Hash-Summen nicht einfach in einer großen Datenbank nachschlägt, da der gesaltete Hash von dem normalen Hash unterscheidet.
Pepper ( Pfeffer )
Der Pepper ist im Prinzip ein "globaler Salt", der für alle Accounts gleich ist und, genau wieder Salt, optional alleine oder in Verbindung mit ihm genutzt werden kann. Pfeffer und Salz ergänzen sich prima, da, sollte jemand Zugriff auf die Datenbank haben, er den Pepper nicht kennt, sollte er ihn aber kennen und in den Jahren vor dem Hack eine Datenbank mit dem Pepper angelegt haben über den Salt stolpert. Außerdem macht er den String vor dem Hashen noch etwas länger
Kollisionen
Kollisionen existieren, wenn 2 Werte den selben Hash haben. Eine Beispiel-Kollision für MD5:
d131dd02c5e6eec4693d9a0698aff95c
2fcab5[b]8[/b]712467eab4004583eb8fb7f89
55ad340609f4b30283e4888325[b]7[/b]1415a
085125e8f7cdc99fd91dbd[b]f[/b]280373c5b
d8823e3156348f5bae6dacd436c919c6
dd53e2b487da03fd02396306d248cda0
e99f33420f577ee8ce54b67080a80d1e
c69821bcb6a8839396f9652b6ff72a70
d131dd02c5e6eec4693d9a0698aff95c
2fcab5[b]0[/b]712467eab4004583eb8fb7f89
55ad340609f4b30283e4888325[b]f[/b]1415a
085125e8f7cdc99fd91dbd[b]7[/b]280373c5b
d8823e3156348f5bae6dacd436c919c6
dd53e23487da03fd02396306d248cda0
e99f33420f577ee8ce54b67080280d1e
c69821bcb6a8839396f965ab6ff72a70
Alles anzeigen
Nun ist es sehr unwarscheinlich, dass ein anderer Benutzer just dieses Passwort hat, aber wenn man genug Zeit hat kann man zu eigentlich jeden Hash eine Kollision finden
Verschlüsselung
Eine Verschlüsselung ist kein Hash !
Eine Verschlüsselung zeichnet sich dadurch aus, dass man sie wieder entschlüsseln kann - unterschieden wird dabei zwischen symetrisch und asymetrisch. Bei ersteres wird zum Ver- und Entschlüsseln das gleiche Passwort genutzt ( Beispiel: AES ), bei zweiteren sind die Passwörter unterschiedlich ( Beispiel: DES, Public-Key-Verfahren. Natürlich kann man das auch mischen, dass das Passwort asymetrisch gespeichert / gesendet wird und danach auf symetrische verfahren zugegriffen wird ( "Hybride Verschlüsselung" ) - der Vorteil liegt dabei daran, dass man nicht den Geschwindigkeitsverlust von dem asymetrischen Verschlüsselungsverfahren einbüßt, das Passwort sicher übertragen kann und die Verbindung danach auch noch sicher ist.
Kodierungen
Eine Kodierung unterscheidet sich von einer Verschlüsselung dadurch, dass die Kodierung kein Passwort hat. Als ein bekanntes Beispiel dient Base64 oder Caesar. Problematisch wird es u.a. bei der Rot-"Verschlüsselung", da dort theoretisch auch ein Passwort genutzt wird, es sich aber schnell erraten lässt - und das Caesar theoretisch auch nur Rot13 ist, könnte man es ja auch als Passwort einstufen
Wie realisiere ich jetzt einen sicheren Login ?
Als Hilfe dafür habe ich 2 Funktionen definiert (findet ihr gaaaaaanz unten), eine erzeugt einen Salt beliebiger Länge, die andere Hasht den Salt und das Passwort zu beliebiger Länge.
Beispiel zur Nutzung: new salt[64];
new pwhash[128];
GenerateSalt(64, salt); // Wir erstellen einen zufälligen Salt für den Benutzer
CreateSaltedHash(inputtext, salt, 128, pwhash); // Wir erstellen einen salted Hash des Passwortes ( inputtext <=> Passwort ) Wichtig ist, und das wiederhole ich jetzt noch einmal, dass der Salt mitgespeichert wird.
Denn ein anderer Salt ergibt ein anderen Hash.
Vergleichen können wir die Passwörter nun folgendermaßen: new pwhash[128];
CreateSaltedHash(inputtext, PInfo[playerid][pSalt], 128, pwhash); // Wir erstellen einen salted Hash des Passwortes ( inputtext <=> Passwort )
if(strcmp(PInfo[playerid][pSaltedHash], pwhash, false) == 0)
SendClientMessage(playerid, 0xFF00FF, "Du hast dich eingeloggt");
else
SendClientMessage(playerid, 0xFFFF00, "Login falsch");
MD5
MD5 ist ein Algorithmus, der sich mittlerweile sehr durchgesetzt hat - wie alle anderen Hashfunktionen lässt auch er sich nicht wieder "zurückumwandeln", es ist aber auch hier möglich, den originalen Wert zu "erraten" ( dauert aber etwas ). MD5 gibt unabhängig von dem normalen Passwort einen 32 Byte langen String zurück der die Zeichen 0 - 9 und a - f / A - F hat.
Hier findet ihr eine Include von Y-Less, mit der ihr MD5 in SA:MP umsetzen könnt. Empfohlen wird aber auch hier, einen Salt hinzuzuschalten, da es für MD5 wesentlich größere Datenbanken gibt. Ein Beispiel ohne Salt währe folgendes: new hash[32];
hash = MD5_Hash("test"); Und mit dem Salt könnte man es wie folgt umsetzen: new salt[32];
new password[20 + 32]; // 20 Zeichen + 32 Zeichen vom Salt
new hash[32];
GenerateSalt(32, salt);
format(password, sizeof(password), "%s%s", inputtext, salt);
hash = MD5_Hash(password); Bei beiden Beispielen haben wir dann in der variable "Hash" den Hash, den wir eintragen. Im Zewiten brauchen wir zusätzlich noch den Salt, den wir speichern
Auf der Basis meiner Salt- und Hashsysteme unten, die ich übrigens selber geschrieben habe (deswegen hat das auch so lange gedauert ) könnt ihr übrigens eure eigenen Hashsysteme basteln
Dazu müsst ihr nur das Array erweitern und bei der CreateSaltedHash den 2.ten Operator der Modulorechnung anpassen
Ich hoffe, ich konnte euch der Passwortsicherheit ein Stücken näher bringen
Tion
Auch jetzt gilt, wie immer: Fragen sind zum Fragen da, Feedback ist erwünscht (heute auch mal negatives) und Ideen können eingebracht werden
Versteh ich das richtig und ich muss neu anfangen, oder wie ist das jetzt mit den 2 Servern?
Du kannst neu anfangen, oder du spielst auf Server 1 mit der alten Datenbank weiter
Okay, sollte jetzt gehen, habe ausversehen schon die neuste Version hochgeladen aber noch nicht die Datenbank angepasst