[Python-de] Problem mit md5

Peter Otten __peter__ at web.de
Mit Aug 17 18:16:34 CEST 2005


Am Mittwoch, 17. August 2005 11:08 schrieb Torsten Rudolph:
> Der folgende Code erzeugt mir genau das erwartete Ergebniss.
>
> m = md5.new()
> m.update('\206password\370\342\211\150\252\301\046\322\354\040\063\243\024\
>102\336\233') hashpassword = m.hexdigest()
>
> Wenn ich mir das Passwort allerdings dynamisch über folgenden Code
> erzeugen will, bekomme ich ein anderes Ergebniss. Wieso? Und wie kann
> ich das ändern?
>
> regex = re.compile('MD5')
>
> for line in open(filename):
>     result = regex.search(line)
>     if result:
>         extra1 = string.split(line, "'")[1]
>         extra2 = string.split(line, "'")[3]
>
   # hier einfuegen:
   extra1 = extra1.decode("string-escape")
   extra2 = extra2.decode("string-escape")

> password = extra1 + 'password' + extra2

> m = md5.new()
> m.update(password)
> hashpassword = m.hexdigest()
>
> PS: Im obrigen Code gibt print line gibt folgendes aus:

(ich vermute, dass das im Original alles in einer Zeile steht)

> document.sendin.password.value = hexMD5('\206' +
> document.login.password.value +
> '\370\342\211\150\252\301\046\322\354\040\063\243\024\102\336\233');

Dein Grundproblem ist, dass z. B. \206, wenn es aus einer Datei gelesen wird, 
ein String aus vier Zeichen/Bytes ist, während es im Python-Quelltext genau 
ein Zeichen darstellt:

>>> len("\206")
1

Verschiedene Darstellungen desselben Zeichens/Bytes:

>>> chr(int("206", 8)) == chr(134) == "\x86" == "\206"
True

Die einfachste Methode, um aus der Zeichenkette \206 wieder das einzelne Byte 
zu gewinnen ist decode():

>>> "\\206".decode("string-escape")
'\x86'

Kleinigkeiten: 
- viele Funktionen aus dem string-Modul sind veraltet. Statt
string.split(s, delim) schreibst Du besser s.split(delim).
- Für Deine Zwecke sollte ein einfacher Test anstelle der regex ausreichen:

if "MD5" in line:
    # ...

Dass der gesamte Code nicht sonderlich robust ist, ist Dir hoffentlich klar...

Peter