Seite 1 von 1
Mysql-Passwörter Skript
Verfasst: Freitag 11. Juni 2010, 15:20
von pabo
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
Re: Mysql-Passwörter Skript
Verfasst: Freitag 11. Juni 2010, 16:19
von 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.
Re: Mysql-Passwörter Skript
Verfasst: Freitag 11. Juni 2010, 17:07
von veers
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
Re: Mysql-Passwörter Skript
Verfasst: Samstag 12. Juni 2010, 13:33
von sma
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
Re: Mysql-Passwörter Skript
Verfasst: Samstag 12. Juni 2010, 21:50
von derdon
Ähm, warum nimmt die Funktion genkey den Parameter key an, benutzt diesen aber gar nicht?
Re: Mysql-Passwörter Skript
Verfasst: Samstag 12. Juni 2010, 22:16
von BlackJack
@derdon: Vielleicht wollte sma dass der OP wenigstens noch ein ganz klein bisschen Eigenleistung erbringen muss.

Re: Mysql-Passwörter Skript
Verfasst: Sonntag 13. Juni 2010, 09:03
von sma
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
Re: Mysql-Passwörter Skript
Verfasst: Montag 14. Juni 2010, 13:41
von pabo
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()
Re: Mysql-Passwörter Skript
Verfasst: Montag 14. Juni 2010, 14:38
von 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.