JavaScript Math.random() vs. C#'s one

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von seh.

    JavaScript Math.random() vs. C#'s one

    Hi,

    ich bin aktuell echt am verzweifeln.
    Eine Webseite nutzt für eine Login Validierung zur Erschwerung ein Hash Check System.
    D.h. wenn man die Seite aufruft, wird vom Server eine 5 stellige Zeichenkette in ein unsichtbares input-Feld geschrieben.
    Beim einloggen (also beim senden der login post request) wird per JavaScript diese Funktion aufgerufen und die Zeichenkette als Parameter:

    HTML-Quellcode

    1. function GenerateHashes(string) {
    2. var rand = Math.random();
    3. var hash = CryptoJS.SHA1(rand.toString() + rand.toString()).toString(CryptoJS.enc.Hex);
    4. while (hash.indexOf(string) == -1) {
    5. rand = Math.random();
    6. hash = CryptoJS.SHA1(rand.toString() + rand.toString()).toString(CryptoJS.enc.Hex);
    7. if (hash.indexOf(string) !== -1) {
    8. return rand;
    9. }
    10. }
    11. }


    An sich ja sehr verständlich, es wird solange ein Hash generiert aus Math.random() bis in dem Hash diese Zeichenkette mal vorkommt und dann wird der random Wert zurückgegeben und dieser ist sozusagen der hash zur Validierung der dann auch wieder an den Server zurück geschickt wird.

    Jetzt frage ich mich 1. wie können die serverseitig jetzt diesen Wert validieren?
    Und 2. habe ich versucht den Algorithmus in C# zu portieren, allerdings ohne Erfolg.

    C#-Quellcode

    1. private string GetHashMatchesHash(string s)
    2. {
    3. var rand = random.NextDouble();
    4. var hash = ComputeSHA1String(rand.ToString() + rand.ToString());
    5. while (hash.IndexOf(s) == -1)
    6. {
    7. rand = random.NextDouble();
    8. hash = ComputeSHA1String(rand.ToString() + rand.ToString());
    9. if (hash.IndexOf(s) != -1)
    10. return rand.ToString().Replace(',', '.');
    11. }
    12. return null;
    13. }
    14. private string ComputeSHA1String(string s)
    15. {
    16. byte[] bData = Encoding.Default.GetBytes(s);
    17. var sha = SHA1.Create();
    18. var hash = sha.ComputeHash(bData);
    19. var result = string.Empty;
    20. for(int i =0; i < hash.Length; i++)
    21. {
    22. result += hash[i].ToString("X2");
    23. }
    24. return result.ToLower();
    25. }


    Ich habe absolut keine Ahnung woran es scheitert. Ich versuche den Login von C# aus zu handeln. Wenn ich den JavaScript Algorithmus in meine eigene HTML Datei schreibe und die Webseite aufrufe, den hash token manuell rausfrickele und dann durch den JS algo laufen lasse und das Ergebnis davon dann mit der WebRequest aus C# ausführen lasse, funktioniert der login perfekt.

    Lasse ich aber den C# Algorithmus mit dem hash token laufen und sende den mit der webrequest funktioniert der login nicht.
    Jetzt die 2. Frage, woran liegt das? Sind vielleicht Math.random() und Random().NextDouble() unterschiedlich? Ich meine lt. Dokumentation generieren beide eine Zufallszahl zwischen 0 und 1.

    ?( ?(

    Danke im Voraus

    Grüße seh

    PS: Das ganze wird übrigens kein Bot sondern wird hier auf der Arbeit benötigt. Die Webseite um die es sich handelt ist von einem Kunden von uns und der Kunde hat uns beauftragt mit einer Software auf die Webseite zuzugreifen und da Informationen zu grabben. Leider bieten die keine einfache API an und die wollen auch nicht das wir eine API für die machen also muss das ganze jetzt LEIDER GOTTES auf diese Art und Weise erledigt werden.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „seh“ ()

    Ich denke du muss das Replace mit dem "." und "," schon vor der Hashberechnung machen:

    C#-Quellcode

    1. private string GetHashMatchesHash(string s) {
    2. while (true) {
    3. var rand = random.NextDouble().ToString().Replace(',', '.');
    4. var hash = ComputeSHA1String(rand + rand);
    5. if (hash.IndexOf(s) != -1)
    6. return rand;
    7. }
    8. }
    Geht wohl! Gestern hab ich das schon mal ausprobiert weil ich's auf StackOverFlow gelesen hatte, da hatte es aber nicht funktioniert. Ich probiere gleich mal zu rekonstruieren warum.
    Code sieht jetzt so aus und funktioniert prima.

    C#-Quellcode

    1. ​private string GetHashMatchesHash(string s)
    2. {
    3. while (true)
    4. {
    5. var rand = random.NextDouble().ToString(CultureInfo.InvariantCulture);
    6. var hash = ComputeSHA1String(rand + rand);
    7. if (hash.IndexOf(s) != -1)
    8. return rand;
    9. }
    10. }
    @EaranMaleasi Mir ist durchaus bewusst, dass ein Punkt statt einem Komma einen komplett anderen Hash hervorruft, nur verstehe ich nicht warum die das dann prüfen können da Hashes ja nicht so einfach zurückgerechnet werden sollen können. Am Ende wird ja nicht der Hash zur Seite geschickt, sondern die Fließkommazahl mit einem Punkt. Wie können die jetzt wissen, dass ich beim Bilden des Hashs ein Komma in der Fließkommazahl hatte anstatt einem Punkt?!