Strings spielen verrückt!

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
  • Hallo zusammen,


    ich habe mal wieder ein sehr mysteriöses Problem mit der Passwort Verschlüsselung der Accounts. Und zwar erstelle ich mit einer Funktion zwei zufällige Strings, mit denen ich dann die Passwörter sicher verschlüsseln möchte. Zum speichern dieser Strings nutze ich das Standard File System. Zu den Problemen:


    1. Beim erstellen der Strings durch unten angegebene Funktion wird der erste String zwar korrekt erstellt, an den zweiten wird aber einfach der erste erstellte String angehängt (er ist also doppelt so lang!) und das, obwohl (!) der String gar nicht die dafür benötigte Länge hätte.


    Code:



    new string[478], salt[128], key[128], hashedpw[H_WHIRLPOOL_LEN], File:saltfile;
    randomString(salt, sizeof(salt));
    printf("%s (%i)",salt, strlen(salt)); //Länge ist 128
    randomString(key, sizeof(key));
    printf("%s (%i)",key,strlen(key)); //Länge ist 256????!


    Funktion zu randomString:



    stock randomString(strDest[], strLen = 10) //by RyDeR
    {
    while(strLen--)
    strDest[strLen] = random(2) ? (random(26) + (random(2) ? 'a' : 'A')) : (random(10) + '0');
    }


    2. Beim speichern sollte eigentlich der erste und der zweite String gespeichert werden, dies funktioniert teilweise. Es wird nämlich an den ersten zu speichernden String noch die vorher (zum öffnen/erstellen der Datei) angegebene File-Directory angehängt. (Schwer zu erklären aber das steht hinterher in der Datei)


    Code
    6dGJ6VGS60C59s900Q564943l94r5V85582Mh23x0Kxr2fl11k1q24oq857869t20T642v1286H6s33rpND39FB686536dZJ0Bk9306Kxin8wd0c00846U441B4i5Hb0/UserSalts/UncleSub.txt
    r4g50MYf67TQA21dNLQwt470916743Le6qe94dw145hTcMA1Y47n6y0FM9r5c15181gl6xY20DUQV973U38ZlB70V1r698K2U69wX4Bm43x54Per835s0h780N5D229X6dGJ6VGS60C59s900Q


    Code dazu:



    format(string, 100, "/UserSalts/%s.txt", SpielerName(playerid));
    saltfile = fopen(string, io_write);
    if(saltfile)
    {
    format(string, 300, "%s\r\n%s", salt, key);
    fwrite(saltfile, string);
    fclose(saltfile);
    }


    Ich kann nirgendwo einen Fehler erkennen, aber vielleicht weiß ja einer von euch weiter.

  • 6dGJ6VGS60C59s900Q564943l94r5V85582Mh23x0Kxr2fl11k1q24oq857869t20T642v1286H6s33rpND39FB686536dZJ0Bk9306Kxin8wd0c00846U441B4i5Hb0/UserSalts/UncleSub.txt
    r4g50MYf67TQA21dNLQwt470916743Le6qe94dw145hTcMA1Y47n6y0FM9r5c15181gl6xY20DUQV973U38ZlB70V1r698K2U69wX4Bm43x54Per835s0h780N5D229X6dGJ6VGS60C59s900Q


    Ist das nrmal das der Teil:


    /UserSalts/UncleSub.txt drin ist oder ist das der Fehler

  • Ich seh da auch keinen Fehler, aber du könntest ja mal mit strdel versuchen die strings vor dem formatieren zu leeren.


    Das könnte evtl. eine Lösung sein.
    Sieht irgendwie nach einem vermischen der Arraymemory aus, auch wenn ich sie mir nicht erklären kann :D

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Ich seh da auch keinen Fehler, aber du könntest ja mal mit strdel versuchen die strings vor dem formatieren zu leeren.


    Das könnte evtl. eine Lösung sein.
    Sieht irgendwie nach einem vermischen der Arraymemory aus, auch wenn ich sie mir nicht erklären kann :D


    Ich kanns mir auch nicht erklärn..naja habs mal mit strdel versucht, damit konnte ich zumindest den zweiten string auf die richtige länge "trimmen".
    Das Speichern bereitet dennoch noch probleme..nun steht in der Datei:


    Code
    Q0099N2blN6fy6gyl0n64Twy31Wc78piE8okqrp4Zje35b1400u6Pa2nt566Ki33p51005s796D9o7PV8SVu3701Ri1ypU3X9z2s97Uy99l6310E9IDPk86t5lyD27sg


    Also der erste string wird nich gespeichert. Hab dann auch mal einfach direkt das gemacht:



    format(string, 100, "/UserSalts/%s.txt", SpielerName(playerid));
    saltfile = fopen(string, io_write);
    if(saltfile)
    {
    //strdel(string, 0, sizeof(string));
    //format(string, 300, "%s\r\n%s", salt, key);
    fwrite(saltfile, salt);
    fwrite(saltfile, "\r\n");
    fwrite(saltfile, key);
    fclose(saltfile);
    }


    Kommt aber das selbe bei raus... :(

  • Passiert das auch, wenn du statt deiner Funktion "SpielerName" den Spielernamen auf normale Art und Weise ermittelst?

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Solche Fehler treten leicht auf, wenn 0 terminierende Zeichen fehlen, oder gepackte strings verwendet werden.
    Falls du das bis morgen früh noch nicht hinbekommen hast kann ich mir das dann mal genauer ansehen. Ich habe die Problemstellung jetzt nur überflogen.
    Edit:
    Das wäre jetzt eine ganz simple Idee. Kannst du ja mal ausprobieren:

    stock randomString(strDest[], strLen = 10) //by RyDeR
    {
    while(strLen--)
    strDest[strLen] = random(2) ? (random(26) + (random(2) ? 'a' : 'A')) : (random(10) + '0');
    strDest[strLen] = EOS;
    }

    PAWNit gratis nutzen?
    Geschenkcode: 2017VQXPKB8V3KA

    Hier könnte Ihre Werbung stehen.

    Einmal editiert, zuletzt von |-|auke ()

  • Solche Fehler treten leicht auf, wenn 0 terminierende Zeichen fehlen, oder gepackte strings verwendet werden.


    Ach stimmt, daran kann es auch liegen :D


    Erhöh mal deine strings um 1
    sprich aus key[128] wird key[129].


    Das Problem ist, das PAWN keine Strings hat, sondern nur Arrays, deswegen brauchen die Funktionen immer noch ein EoS (End of String) -> \0

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • @NicoWiss: Danke für das Kompliment :)
    |-|auke: Deine Veränderung der Funktion ändert nichts, aber der Hinweis auf die 0 terminierenden Zeichen war Gold Wert!
    @BlackAce: Das würde allerdings nicht den gewünschten Effekt bringen. Erst durch das Ersetzen von sizeof() mit 128 wird der 129. Character nicht mehr beschrieben, und bildet somit das Ende.


    new string[478], salt[129], key[129], File:saltfile;
    randomString(salt, 128);
    printf("%s (%i)",salt, strlen(salt)); //Länge ist 128
    randomString(key, 128);
    printf("%s (%i)",key,strlen(key)); //Länge ist 256????!


    Man könnte es (als Alternative) auch so machen:
    new tmp[259];
    format(tmp, 259, "%s\r\n%s", salt, key);
    format(string, 100, "%s.txt", SpielerName(playerid));
    saltfile = fopen(string, io_write);
    if(saltfile)
    {
    fwrite(saltfile, tmp);
    fclose(saltfile);
    }

    Das ist aber bei Weitem nicht so "schön" wie die erste Variante.


    Beide Varianten wurden kompiliert und getestet.