tutorials.de Buch-Aktion 05/2012
Like Tree3Danke
  • 1 Beitrag von deepthroat
  • 2 Beitrag von deepthroat
ERLEDIGT
NEIN
ANTWORTEN
9
ZUGRIFFE
709
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Eroli Eroli ist offline Mitglied Gold
    Registriert seit
    Mar 2007
    Beiträge
    224
    Hallo zusammen,

    ich möchte eine winzige, aber wichtige Python-Funktion in C# nachbauen. Der Python-Snippet sieht so aus:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    import crypt, os, time, md5, string
     
    strPass = raw_input("Enter new Passwort: ")
    strTime = "%s" % time.time()
     
    md5Time = md5.new(strTime)
     
    print crypt.crypt(strPass, md5Time.hexdigest()[0] + md5Time.hexdigest()[1])

    Wie genau kann man das in C# nachbauen und welche Rolle spielt der Zeit-String?

    Vielen Dank für eure Hilfe!

    EDIT: Da hier anscheinend eine UNIX-eigene Funktion benutzt wird, helfen euch vielleicht folgende Dinge:
    Code :
    1
    
    uname -a

    liefert

    Code :
    1
    
    Linux %PCNAME% 2.6.21-1-amd64 #1 SMP %DATUM% x86_64 GNU/Linux

    Googe lieferte mir außerdem
    crypt.crypt(word, salt)¶

    word will usually be a user’s password as typed at a prompt or in a graphical interface. salt is usually a random two-character string which will be used to perturb the DES algorithm in one of 4096 ways. The characters in salt must be in the set [./a-zA-Z0-9]. Returns the hashed password as a string, which will be composed of characters from the same alphabet as the salt (the first two characters represent the salt itself).
    Hier werden also die ersten 2 Zeichen des Datums als "Salz" benutzt, sehe ich das richtig? Wenn ja, wie genau ist time.time() definiert? Wie sieht die ausgabe von time.time() aus?

    Wie funktioniert das eigentlich mti dem Salz? Wenn ich einen String mit einem "Datumssalz" verwürze, dann kann ich doch nie mehr checken, ob das eingegebene Passwort richtig ist, ohne das Datum zu wissen oder irre ich mich hier?
    Geändert von Eroli (30.08.10 um 10:21 Uhr)
     

  2. #2
    Avatar von RudolfG
    RudolfG RudolfG ist offline Mitglied Brokat
    Registriert seit
    Jul 2006
    Ort
    Gummersbach (NRW)
    Beiträge
    337
    Zitat Zitat von Eroli Beitrag anzeigen
    Hier werden also die ersten 2 Zeichen des Datums als "Salz" benutzt, sehe ich das richtig? Wenn ja, wie genau ist time.time() definiert? Wie sieht die ausgabe von time.time() aus?
    Hi,

    in dem unten aufgeführten Link kannst du nach gucken, wie die Ausgabe von time.time() aussieht bzw. diese errechnet wird.

    http://docs.python.org/library/time.html#time.time

    Zu den anderen Punkten:

    Wenn bis heute abends (ca. 22:30 Uhr) kein weiterer geantwortet hat, werde ich mir das Problem bzw. den Fall genauer angucken und dann antworten.

    Gruß
    RudolfG
     
    Technologien
    (Gute) Grundkenntnisse: HTML, CSS
    Fortgeschrittene-Kenntnisse: C++/Qt, C# (WinForms, Webservice), SQL

  3. #3
    Avatar von RudolfG
    RudolfG RudolfG ist offline Mitglied Brokat
    Registriert seit
    Jul 2006
    Ort
    Gummersbach (NRW)
    Beiträge
    337
    Zitat Zitat von Eroli Beitrag anzeigen
    Hier werden also die ersten 2 Zeichen des Datums als "Salz" benutzt, sehe ich das richtig?
    Nicht ganz, hier werden die ersten 2 Zeichen, des MD5-Hash von der Zeit die time.time() zurückliefert genommen.

    Zitat Zitat von Eroli Beitrag anzeigen
    Wenn ja, wie genau ist time.time() definiert? Wie sieht die ausgabe von time.time() aus?
    Siehe den vorherigen Post.

    Zitat Zitat von Eroli Beitrag anzeigen
    Wie funktioniert das eigentlich mti dem Salz? Wenn ich einen String mit einem "Datumssalz" verwürze, dann kann ich doch nie mehr checken, ob das eingegebene Passwort richtig ist, ohne das Datum zu wissen oder irre ich mich hier?
    Also ohne jetzt genau verstanden zu haben wie bzw. was da passiert, ist das eigentlich korrekt (man benötigt also irgendwie das Datum der für das Hashen des Passworts benutzt wurde!).

    Sry aber mehr steige ich da irgendwie nicht richtig durch...

    Gruß
    RudolfG
     
    Technologien
    (Gute) Grundkenntnisse: HTML, CSS
    Fortgeschrittene-Kenntnisse: C++/Qt, C# (WinForms, Webservice), SQL

  4. #4
    Eroli Eroli ist offline Mitglied Gold
    Registriert seit
    Mar 2007
    Beiträge
    224
    Kann mir evtl noch ein anderer helfen?

    Ich habe auch einen MembershipProvider für MySQL in C# geschrieben hier rumliegen (nicht von mir), da wird das auch über so ein komisches Salt-Konstrukt gemacht. Soll ich den Code hier posten? Könnte der jemandem helfen?

    Es ist mir eigentlich ziemlich wichtig, dass ich das irgendwie in C# umgesetzr kriege...
     

  5. #5
    Avatar von RudolfG
    RudolfG RudolfG ist offline Mitglied Brokat
    Registriert seit
    Jul 2006
    Ort
    Gummersbach (NRW)
    Beiträge
    337
    Zitat Zitat von Eroli Beitrag anzeigen
    Ich habe auch einen MembershipProvider für MySQL in C# geschrieben hier rumliegen (nicht von mir), da wird das auch über so ein komisches Salt-Konstrukt gemacht. Soll ich den Code hier posten? Könnte der jemandem helfen?

    Es ist mir eigentlich ziemlich wichtig, dass ich das irgendwie in C# umgesetzr kriege...
    Hey,

    poste man den relevanten Teil, vielleicht sagt mir oder jemand anderen etwas mehr

    Gruß
    RudolfG
     
    Technologien
    (Gute) Grundkenntnisse: HTML, CSS
    Fortgeschrittene-Kenntnisse: C++/Qt, C# (WinForms, Webservice), SQL

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von Eroli Beitrag anzeigen
    Wie funktioniert das eigentlich mti dem Salz? Wenn ich einen String mit einem "Datumssalz" verwürze, dann kann ich doch nie mehr checken, ob das eingegebene Passwort richtig ist, ohne das Datum zu wissen oder irre ich mich hier?
    Die 2 Zeichen die als Salt bei dem verwendeten DES basierten Schema verwendet werden, finden sich in der Ausgabe der crypt Funktion an den ersten beiden Stellen wieder:
    Code :
    1
    
    crypt(X, ab) == abZ
    Gruß

    PS: Unix crypt in .NET: http://www.codeproject.com/KB/cs/unixcrypt.aspx

    PPS: Übrigens ist es völlig egal wie du den Salt berechnest, Hauptsache er ist halbwegs zufällig.
    Geändert von deepthroat (30.08.10 um 09:30 Uhr)
    Eroli bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  7. #7
    Eroli Eroli ist offline Mitglied Gold
    Registriert seit
    Mar 2007
    Beiträge
    224
    Hallo,

    danke für die vielversprechende Antwort.
    Ich habe mir UnixCrypt runtergeladen, eingebunden und eine kleine Testapplikation geschrieben:

    Code csharp:
    1
    2
    3
    4
    
            private void EncryptButton_Click(object sender, EventArgs e)
            {
                EncryptedPWTextBox.Text = UnixCrypt.Crypt(PasswordTextBox.Text);
            }

    Allerdings kommt bei jedem Klick auf den Button ein VÖLLIG anderes, verschlüsseltes Passwort heraus (Bei gleichem Inhalt der TextBox). Wie kann das sein?

    Wenn ich dich richtig verstanden habe, dann kann ich den Salt ja auch irgendwie anders generieren, also einfach mal so, wie UnixCrypt das eben macht - ist ja auch egal, richtig?

    Aber es kann doch nicht sein, dass sich das ganze verschlüsselte Passwort andauernd ändert...Ich dachte nur die ersten 2 Zeichen sind betroffen?

    Wo habe ich den Denkfehler?
    Geändert von Eroli (30.08.10 um 10:26 Uhr)
     

  8. #8
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von Eroli Beitrag anzeigen
    Allerdings kommt bei jedem Klick auf den Button ein VÖLLIG anderes, verschlüsseltes Passwort heraus (Bei gleichem Inhalt der TextBox). Wie kann das sein?
    Das ist zu erwarten. Der Salt ist ja auch jedesmal ein völlig anderer.

    Das gleiche passiert auch bei der Python Funktion, die Zeit läuft weiter und es ergibt sich jedesmal ein anderer Salt. Der Salt bestimmt welche Methode intern zur Berechnung des Hashes verwendet wird.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  9. #9
    Eroli Eroli ist offline Mitglied Gold
    Registriert seit
    Mar 2007
    Beiträge
    224
    Der Salt bestimmt welche Methode intern zur Berechnung des Hashes verwendet wird.
    Achsoo...

    Aber wie kann ich denn dann nun vergleichen, ob das eingebene Passwort richtig ist und mit dem in der Datenbank übereinstimmt?

    EDIT: Von hier: http://www.15seconds.com/issue/000217.htm
    Authenticating a User

    Finally, we will write code that validates a given username/password pair. The validation algorithm goes as follows:

    1. Look up the given username in the user database. If found, retrieve the corresponding salt and hash values. Otherwise display the User Not Found error and exit.
    2. Concatenate the submitted password with the salt retrieved from the database. Compute the hash value of the bundle.
    3. Compare the value obtained in step 2 with the hash value retrieved from the database. If they match, the user is authenticated.
    Sehe ich das richtig, dass der Salt auch in der Datenbank gespeichert werden muss, um einen Vergleich durchführen zu können? Das ist bei uns nämlich nicht der Fall (wenn ich micht nicht irre)...
    Geändert von Eroli (30.08.10 um 10:53 Uhr)
     

  10. #10
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von Eroli Beitrag anzeigen
    Aber wie kann ich denn dann nun vergleichen, ob das eingebene Passwort richtig ist und mit dem in der Datenbank übereinstimmt?

    EDIT: Von hier: http://www.15seconds.com/issue/000217.htm

    Sehe ich das richtig, dass der Salt auch in der Datenbank gespeichert werden muss, um einen Vergleich durchführen zu können? Das ist bei uns nämlich nicht der Fall (wenn ich micht nicht irre)...
    Wie bereits gesagt, ist der verwendete Salt die ersten beiden Buchstaben des Hashes.

    Um zu checken:

    1. Passwort Hash aus der DB laden.
    2. crypt Funktion mit dem übergebenen Passwort und den beiden ersten Buchstaben des Hashes aus der DB als Salt aufrufen.
    3. wenn DB.Hash == crypt(Passwort, Salt) dann ALLOW, sonst DENY

    Gruß
    RudolfG und Eroli bedanken sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

Ähnliche Themen

  1. [Python] Script ( .py ) aus Python Kommandozeile (python.exe) heraus öffnen
    Von Hookah im Forum CGI, Perl, Python, Ruby, Power Shell
    Antworten: 0
    Letzter Beitrag: 16.12.09, 10:59
  2. [Python] Regex Hilfe
    Von chmee im Forum CGI, Perl, Python, Ruby, Power Shell
    Antworten: 2
    Letzter Beitrag: 07.06.09, 12:27
  3. Windows-Umgebungsvariablen mit Hilfe von Perl oder Python setzen
    Von DaFunk2k im Forum CGI, Perl, Python, Ruby, Power Shell
    Antworten: 2
    Letzter Beitrag: 03.07.07, 07:51
  4. Hilfe: StoppUhr mit Python
    Von SkinnyPuppy im Forum CGI, Perl, Python, Ruby, Power Shell
    Antworten: 0
    Letzter Beitrag: 11.06.07, 07:37
  5. [Python] Video tutorial zu dem Python Webframework TurboGears (20 Min )
    Von Thomas Darimont im Forum CGI, Perl, Python, Ruby, Power Shell
    Antworten: 0
    Letzter Beitrag: 07.12.06, 13:28

Stichworte