Mysql-Passwörter Skript

Code-Stücke können hier veröffentlicht werden.
Antworten
pabo
User
Beiträge: 2
Registriert: Freitag 24. März 2006, 20:32

Hi

ich versuche gerade ein Skript aus C# bzw. VB nach Python zu übersetzen. Mir machen die ZeichenUmwandlungs-Funktionen Probleme. Vielleicht ist es für jemanden hier ein Kinderspiel:

http://pastebin.com/QT5Q47Gr

Meine Probleme liegen in Zeile 9 bzw 23. Da wird ein Byte mit ToString("X") umgewandelt. (Ein Oktalzeichen?).



Gruß
pabo
BlackJack

@pabo: Das ist für jeden ein Kinderspiel der sich die entsprechende Dokumentation anschaut: hashlib.

Diese Funktionen lassen sich in Python als Einzeiler schreiben.
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Das scheint mir auch in C# relativ schleierhaft zu sein. Zum einen gibt es FormsAuthentication.HashPasswordForStoringInConfigFile (schrecklicher Name). Zum anderen ist die Initialisierung des StringBuilders falsch. Und zu guter letzt ist .ToString("X") vermutlich auch noch falsch.

1.ToString("X") -> 1
Gewünscht ist jedoch ziemlich sicher
2.ToString("X2") -> 01

:K
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Das ToString() bei der VB.NET-Variante ist okay. Nur die C#-Version ist falsch. Bei VB.NET wird ja das Äquivalent zu ("0" + "%x" % n)[-2:] gemacht, also falls die von ToString("X") erzeugte Hex-Zahl nur einstellig ist, wird die zuvor vorgefügte 0 eben mit genommen. In beiden Fällen scheint es mir aber Blödsinn zu sein, wie die Kapazität des StringBuilder initialisiert wird. Ich vermute, dass auch in VB.NET es so ähnlich wie in Java ist, wo der Print-String eines Array nicht der Inhalt ist, sondern irgendein anderer Wert. Dessen Länge zu nehmen ist genauso falsch wie die Länge des Arrays in der C#, wo ja der Hex-String doppelt so lang wird. Schlecht ist auch, dass "*" nicht einfach zuerst in den StringBuffer zu packen, sondern es später (mit einem impliziten StringBuilder) zu addieren. Natürlich könnte man auch einfach wissen, dass ein SHA1 20 Bytes lang ist und damit der Hex-String 40 Zeichen hat.

In Python:

Code: Alles auswählen

def genkey(key):
    import hashlib
    return "*" + hashlib.sha1(key.encode("utf-8")).hexdigest()
Stefan
Zuletzt geändert von sma am Sonntag 13. Juni 2010, 09:02, insgesamt 1-mal geändert.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Ähm, warum nimmt die Funktion genkey den Parameter key an, benutzt diesen aber gar nicht?
BlackJack

@derdon: Vielleicht wollte sma dass der OP wenigstens noch ein ganz klein bisschen Eigenleistung erbringen muss. ;-)
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

derdon hat geschrieben:Ähm, warum nimmt die Funktion genkey den Parameter key an, benutzt diesen aber gar nicht?
Weil das Forum den Code nicht automatisch ausführt und mir zeigt, ob er korrekt funktioniert. Dafür sind andere Forumsteinehmer da :)

Stefan
pabo
User
Beiträge: 2
Registriert: Freitag 24. März 2006, 20:32

Wow, hier passiert aber eine Menge. Hut ab.
Und tatsächlich: es geht als Einzeiler:

Code: Alles auswählen

def encodePassword(self, password, salt=None):
        return '*%s' % sha1(sha1(unicode(password, "utf-8")).digest()).hexdiges
t()
BlackJack

@pabo: Damit berechnest Du die Prüfumme von der Prüfsumme und wenn `passwort` etwas ausserhalb von ASCII enthält dürfte das nicht funktionieren.
Antworten