Hilfe: Python-Snippet --> C#

Eroli

Erfahrenes Mitglied
Hallo zusammen,

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

Code:
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:
uname -a

liefert

Code:
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?
 
Zuletzt bearbeitet:
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
 
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.

Wenn ja, wie genau ist time.time() definiert? Wie sieht die ausgabe von time.time() aus?

Siehe den vorherigen Post.

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
 
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... :-(
 
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 :D

Gruß
RudolfG
 
Hi.
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:
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.
 
Zuletzt bearbeitet:
Hallo,

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

C#:
        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?
 
Zuletzt bearbeitet:
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ß
 
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)...
 
Zuletzt bearbeitet:
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ß
 

Neue Beiträge

Zurück