Beiträge von Kaliber

    Hmm, also hier mal generell Limits: https://wiki.sa-mp.com/wiki/Limits


    Hier z.B. mit der Map (hatte mich geirrt, die SA Map ist von 3000 bis -3000 groß, aber getriggert wird wohl bis 4096)

    Known Bug(s): Pickups that have a X or Y lower than -4096.0 or bigger than 4096.0 won't show up and won't trigger OnPlayerPickUpPickup either.

    Und die höhe der Interiors kannst du an der Z-Koordinate ablesen: http://weedarr.wikidot.com/interior


    Also z.B. -25.884498,-185.868988,1003.546875 da sehen wir, dass die Höhe 1003 SA Meter sind.


    Und alle weiteren sind auch so um ~1000 SA Meter über der Map :)

    1. Es ist nur wichtig, dass sich die Interiors in den Zonen der SA:MP Map befinden. Also von -3000 bis 3000. Und zu weit unter der Map ist schlecht, weil man dann evtl über die Map gesetzt werden kann. Dementsprechend empfehle ich dir in der Luft (so wie das GTA SA auch macht) die Interiors zu mappen. Am Besten so auf einer Höhe von 2000. Weil bei 1000 sind die offline gta interiors.


    2. Es gibt sowas: https://wiki.sa-mp.com/wiki/GameTextStyle


    Das eine sind GameTexts (da ist die Auswahl limitiert, wie du siehst) und das andere sind TextDraws, wo du alles mögliche mit machen kannst. Also das was du vor hast ist definitiv mit TextDraws umsetzbar :)


    Musst mal nach einem TextDraw Creator und Tutorial schauen, da wird dir das alles erklärt :)

    Meiner Meinung nach, ist sowas wie Bcrypt in SA:MP garnicht nötig.
    Z.b. Whirlpool ist schon ziemlich sicher, und wir reden hier ja nur von einem SA:MP Server Passwort. Ich glaube nicht, dass jemand mehrere Monate oder Jahre mein Passwort brute forcet, um dann meine 500.000GTA$ auf sein Konto zu überweisen.

    Es geht hier nicht um SA:MP.


    Das geht ja viel weiter.


    In den meisten Datenbanken steht ja auch noch die Email dieses Nutzer oder der Nickname ist eben eindeutig.


    Es besteht jetzt eine hohe Wahrscheinlichkeit, dass der User dieses Passwort überall verwendet (nicht nur auf dem SA:MP Server).


    Das ist auch der Grund, wieso das so ein Ding im Thread über ReborN ist, es geht hier nicht um einen SA:MP Server, der eh down ist, sondern um die Tatsache, dass es nun möglich wäre die Email Adresse von Nutzern zu knacken oder sogar auf anderen Plattformen wie Facebook/Twitter/Instagram/Breadfish etc zu hacken oder gar zu erpressen.


    Der Punkt ist, dass User-Daten sensible Daten sind und diese mit höchster Sicherheit zu verwahren sind. (In Deutschland gilt ja jetzt die DSGVO, weswegen man sogar juristisch angreifbar wäre).


    Und um ein SHA-256 Passwort zu knacken bedarf es keine Monate. Ohne Salt/Pepper hat man das in Millisekunden dank riesen Rainbow-Tables.
    Mit Salt/Pepper dauert es je nach Rechenleistung aber auch nicht so lange, da diese Hash-Funktionen gut parallelisierbar sind (das heißt je mehr Geräte, desto schneller).


    Und man könnte leicht sich eine bestimmte Person raussuchen und fertig machen.


    Deshalb wirklich bcrypt (da es ja auch gar keinen großen Aufwand darstellt, dies einfach zu nutzen) um sicher zu gehen :)

    cache_get_value_name: field 'name' not found

    Das sagt aus, dass es in deiner Tabelle keine Spalte mit dem Namen "name" gibt :)


    Deshalb kann BizInfo[i][bName] nicht geladen werden.


    Das mit dem cache_get_row_count: no active cache kommt ja erst später.


    Kann es ventuell sein, dass es sich da gar um eine andere Funktion handelt oder dass du das einfach so irgendwo im Code plötzlich verwendest, wo es gar keinen Cache gibt?!


    Das würde das dann erklären ^^

    Hallo liebe Brotfische,


    der Thread, über die Entsprrung von ReborN (Entsperrung von ReborN) hat mich zu diesem Thema inspiriert.
    Eigentlich ist das ja nur so hoch gekockt, weil er eine schlechte Hash-Methode benutzt hat (Wie soviele andere hier auch).


    Das zeigt ja eigentlich, dass man sich das auch gleich hätte schenken können. Denn schlechtes Hashing, ist fast gar kein Hashing.


    Aber woran das genau liegt und was das alles eigentlich genau ist, wird mal in diesem Thread ein wenig besprochen.


    Wir beginnen, mit dem bekannten Irrtum, dass ein Hash = eine Verschlüsselung ist.


    Was ist eine Verschlüsselung?

    Hier sollten wir zunächst auf ganz einfache Art- und Weise klären, was eine Verschlüsselung ist.
    Wir nehmen klassisch die gute alte Cäsar Verschlüsselung als Beispiel.


    Dort haben wir z.B. ein Wort "abc" und nehmen jetzt einfach immer einen Buchstaben weiter im Alphabet.
    Aus "abc" wird nun also "bcd".
    Aus "Hallo" wird "Ibmmp".


    Wow, perfekt verschlüsselt.


    Naja, nicht ganz, da es ja nur 26 Möglichkeiten gibt und man diese schnell durchprobieren kann.
    Deshalb wird diese auch nicht verwendet.


    Wir halten also fest, bei einer Verschlüsselung, verliert man keine Informationen (sieht man hier ganz deutlich, Input und Output haben die selbe Länge).
    Das ist ja auch notwendig (dass keine Information verloren geht), sonst könnten wir natürlich nicht mehr den Ursprünglichen Text rekonstruieren.


    Was ist nun Hashen?

    Nun, hier nutzt man eine mathematische Einwegfunktion (na super, toll erklärt), um eine Eindeutige Zeichenkette zu erhalten.
    Im Endeffekt können wir das mal ganz einfach an einem Beispiel exemplarisch erklären:


    Also wir nehmen den Index der Buchstaben im Alphabet (also A=1,B=2,C=3 usw).


    Dann haben wir ein Wort wie "Hi" und das kommt in unsere hash Funktion und daraus wird 8+9=17.


    Aus der 17 können wir jetzt aber gar nicht eindeutig ableiten, dass es sich ursprünglich um das Wort "Hi" gehalten hat.
    Es könnte ja auch einfach nur der Buchstabe "Q" sein.


    Und das ist ein Problem bei Hash-Funktionen, sie sollten zwar immer Eindeutig sein, aber das sind sie nicht.
    Eine große Schwäche von MD5 zum Beispiel ist, dass man schnell Zahlenkombinationen für bestimmte Hash-Werte findet.
    Man brauch für eine Passwort-Abfrage dann natürlich auch gar nicht den originalen Wert, sondern es reicht ja, dass der Hash-Wert übereinstimmt.


    Bei modernen Hash-Funktionen ist das sogar komplett unmöglich auf das ursprüngliche Passwort zu kommen, da diese eine feste Länge haben.
    Egal ob "hi" oder das komplette Werk von Goethe, wir landen bei MD5 z.B. immer genau bei 32 Stellen.
    Ganz offensichtlich gehen hier Informationen verloren.
    Aber das ist ja auch okay, weil wir ja gar nicht alle Informationen haben wollen, sondern nur sicher gehen wollen, dass wir wissen, dass unsere Eingabe mit dem Hash übereinstimmt.


    Allerdings gibt es sogenannte Rainbow-Tables, wo schon alle möglichen Passwörter gehasht wurden und man so versuchen kann, auf das Passwort zu schließen.
    Natürlich nicht immer möglich, wie z.B. bei den Büchern von Goethe...da ist ganz klar, dass wir da nichts finden werden, allerdings durch eine andere kleinere Buchstaben/Zahlen Kombination auf den selben Hash kommen können.


    Was hat es mit Salt oder Pepper auf sich?

    Also egal ob Salt oder Pepper, damit bezeichnet man im Endeffekt nur eine zufällige Zeichenkette (String), die vorne oder hinten an das Wort gehangen wird.


    Der Unterschied ist, dass ein Salt immer neu (z.B. für jeden Nutzer) generiert wird und ein Pepper, immer die selbe Zeichenkette ist (die dann aber halt nicht in der Datenbank, sondern woanders steht).


    Hat man z.B. alle seine Passwörter mit einem guten Pepper versehen und man hat nur die Datenbank, ohne Pepper, kann man damit nicht wirklich was anfangen.


    Denn

    • Man kann die Passwörter nicht in Rainbow-Tables finden, weil diese ja nicht den Pepper berücksichtigen.
    • Wenn der Server noch online ist, kann man sich nicht in die Accounts hacken, weil man ja nicht weiß, wie der Pepper den Hash verändert.

    Das ist zum Beispiel für SA:MP Server in meinen Augen sicherer, als den Salt direkt mit in der Datenbank zu speichern.
    Dann könnte man nämlich, wenn der Server noch läuft, wirklich Accounts knacken.


    Welche Hash-Methode denn nun?

    Hier geht man immer von dem Szenario aus, dass der Angreifer, sowohl den Salt/Pepper hat + das gehashte Passwort.
    MD5 wird ja oft verwendet, aber das hat 2 große Nachteile.

    • Es kann sehr sehr schnell berechnet werden. Und so super schnell Passwörter knacken.
    • Es ist nicht sehr Eindeutig. Da die Länge nur 32 Zeichen beträgt. Man kann also auch schnell andere Kombinationen finden und so Accounts knacken.

    SHA-256 oder Whirlpool sind besser, weil Punkt 2 sicherer ist.
    Allerdings sind diese Verfahren auch noch sehr schnell zu berechnen, das ist der Grund, warum diese auch nicht so gerne genutzt werden.


    Um Punkt 1 nun zu verhindern und zu schauen, dass man diese nicht so einfach bruteforcen kann, bedarf es also einer langsamen Hash-Methode.
    Und hier kommt Bcrypt bzw Scrypt ins Spiel.


    Um also wirklich sicher zu gehen, dass man theoretisch Salt/Pepper + gehashtes Passwort dem Angreifer in die Finger fallen und man Bcrypt verwendet hat, sind diese Daten immer noch relativ sicher, da es suuuuper lange dauern würde, bis man ein Passwort geknackt hätte.


    Download: Github - BCrypt Plugin


    Schlusswort
    In diesem Sinne, kann ich nur jedem Bcrypt ans Herz legen, um wirklich sicher zu gehen, dass alle Passwörter sehr gut gesichert sind.
    Hoffe der Thread klärt ein bisschen auf, falls es Fragen oder Anmerkungen gibt, gerne einfach schreiben.



    Mit freundlichen Grüßen
    Euer Kalle :P

    Ahh ich hatte einen kleinen Fehler, nämlich wenn folge1 größer ist als folge2.


    Schreib es mal so:



    //Edit:


    Ja x++ ist das selbe wie x=x+1 oder x+=1 :)


    ++x ist aber was anderes, das erhöht x um 1 bevor es verwendet wird :D und x++ erst nachdem es verwendet wurde :D

    Das könntest du sneaky so lösen:


    Ist der Code selbsterklärend oder spezifische Fragen? :D


    Gerade zu faul soviel Text zu schreiben xD Sorry haha xD


    #FrohesNeus <3

    Ich erstelle Züge so:

    Du musst auch schon CreateVehicleEx verwenden und nicht AddStaticVehicle und eben den Parameter für den Zug auf true setzen..



    nur einer ausgewählt werden soll (random mäßig)?

    Kannst du so lösen:



    Muss aber dazu gesagt werden, dass isPlayerTTT schon einen Index für den Spieler benötigt, wie im Beispiel gezeigt.


    Also das muss new bool:isPlayerTTT[MAX_PLAYERS]; deklariert werden.


    und die 20 bei tmp bedeutet, dass es maximal 20 Spieler sein können. Sind es nur 5, setz es auf 5 :)

    Du solltest nicht alles in einem Array speichern, weil diese dann immer die größte Größe hätten.


    Sagen wir du hast 50 FBI Fahrzeuge, aber nur 10 Taxi Fahrzeuge, würde das so dazu führen, dass 50 trotzdem der größte Index wäre, und somit ist das eine Speicherplatzverschwendung.


    Allerdings kannst du natürlich eine enum für jede Variable, die für eine Fahrzeuggruppe steht deklarieren:




    Aber es wäre interessant zu wissen, was genau für Eigenschaften du zusätzlich noch haben magst.


    Man kann diese ganzen Systeme natürlich auch viel dynamischer aufbauen z.B. indem du alles in einer MySQL Datenbank speicherst oder du alle Eigenschaften konstant deklarierst und dann einfach nur eine Schleife drüber laufen lässt.


    Hier auch mal ein Tutorial über das mit dem MySQL Zeug von Jeffry: [jTuT] Fraktions-Fahrzeug-System mit MySQL R39-5


    Keine Ahnung, was du alles vor hast.