Seite 1 von 2

random.Random() liefert unterschiedliche Ausgaben???

Verfasst: Sonntag 3. Dezember 2006, 13:02
von jens
Ich hab das Problem, das meine PyLucid Passwörter offensichtlich nicht Plattformunabhängig sind :( http://pylucid.net/trac/ticket/30

Erste Vermutung: hash() liefert unterschiedliche Werte (Python 2.2 <-> Python 2.3)

An hash() liegt es aber wohl nicht, da ich ja mittlerweile md5() nutzte und der sollte IMHO immer den selben Wert liefern...

Nun vermute ich, das es an random.Random() liegt. Kann es sein, das es mit dem gleichen seed unterschiedliche Werte bei unterschiedlichen Plattformen bzw Python Versionen liefert?

Verfasst: Sonntag 3. Dezember 2006, 13:36
von birkenfeld
Wie immer ist Dokumentation lesen aufschlussreich: http://docs.python.org/lib/module-random.html, 7. Absatz.

Verfasst: Sonntag 3. Dezember 2006, 13:40
von jens
Ja, du meinst:
Changed in version 2.3: Substituted MersenneTwister for Wichmann-Hill.
oder?

Das wird es wohl sein :(

Verfasst: Sonntag 3. Dezember 2006, 13:44
von birkenfeld
Genau. Der Wichmann-Hill-Generator ist allerdings immernoch im random-Modul, als random.WichmannHill.

Wenn du also diese Klasse direkt instanzierst, hast du immer den gleichen Generator.

Verfasst: Sonntag 3. Dezember 2006, 13:58
von Leonidas
Sorry (CNR), aber der Namen dieses Threads erinnert mich etwas an Coded Smorgasbord: Prepare For Return, an diesen Absatz:
Daily WTF hat geschrieben:hi all,

IntTemp = Int((255 * Rnd()) + 1)

I used above ASP.NET code. Problem is in " Rnd() "
Rnd() value is changing everytime.

What is the alternative for Rnd()?
OR How will stop Rnd() value changes at everytime?
:D

Verfasst: Sonntag 3. Dezember 2006, 17:46
von jens
Ich blicke langsam nicht mehr durch :( Keine Ahnung ob im crypt Modul noch ein Fehler ist oder nicht. Also ob auf unterschiedlichen Rechnern, unterschiedliche Passwörter raus kommen.

Keine Ahnung ob das hash() Problem wirklich existierte oder nicht.

Ich hab extra mal ein Plugin für PyLucid geschrieben: EvilEval Damit kann man Python Code direkt online ausführen. (Oder auch Kommandos auf der shell)

Hab diesen Code auf drei verschiedenen Rechnern Probiert:

Code: Alles auswählen

from PyLucid.system import crypt

key = "TestKey"
msg = "Das ist ein dummer Text"

encrypted = crypt.encrypt(msg, key)
print encrypted, hash(encrypted)
print crypt.decrypt(encrypted, key)

print "-"*79

crypt.__test_old_decrypt__()
Liefert bei mir immer die selben Daten:
yVljhgh0UwKKz2GMUTs5BSE5Mns0Zlo1HDx5Fid7FXIAKmEPOG1a -734220794
Das ist ein dummer Text
-------------------------------------------------------------------------------
__________________________________________________________________
old decrypt implementation test:
Test Data ok: True
encrypt test: True
Das Ergebnis ist überall das selbe!
Von daher weiß ich nicht, ob es überhaupt ein Problem gibt!
OK durch die Änderung im Random Modul dürften zumindest Passwörter zwischen Python 2.2 und 2.3 "defekt" werden, aber das solle nun nicht mehr so dolle stören...

Ich lasse es jetzt erstmal so und bei der nächsten PyLucid Release wird da nochmal angepackt:
Zum einen kommt ein neuer Crypt Algo ran
Zum anderen gibt es dann hoffentlich den User-Pass-Recovery und im schlimmsten Fall müßen sich die User halt ein neues Passwort erstellen.

Verfasst: Sonntag 3. Dezember 2006, 18:39
von BlackJack
"Password recovery" setzt doch aber voraus, dass das Passwort irgendwo gespeichert wird!?

Verfasst: Sonntag 3. Dezember 2006, 22:30
von birkenfeld
BlackJack hat geschrieben:"Password recovery" setzt doch aber voraus, dass das Passwort irgendwo gespeichert wird!?
Das ist etwas verwirrend, nicht? Ich versuche schon gar nicht mehr mitzuverfolgen, wo jetzt wie welche Daten zum Login gespeichert und übertragen werden.

Verfasst: Montag 4. Dezember 2006, 06:49
von jens
BlackJack hat geschrieben:"Password recovery" setzt doch aber voraus, dass das Passwort irgendwo gespeichert wird!?
Nein, bloß das nicht!

Aber mal im ernst... Warum sollte man das Passwort im Klartext speichern?
Ich wollte es gerade nicht so machen wie manche Dienste und das Passwort einfach im Klartext per Mail zu senden...
Auch kommt nicht in Frage, ein zufälliges Passwort zu setzten und per Mail zuzuschicken. Ist nämlich Lustig, wenn Leute den Nick und die EMail Adresse kennen ;)

Nein, ich hab da ehr an sowas gedacht:
  • 1. User geht auf "Passwort vergessen Link"
    2. Username und EMail eintragen
    3. PyLucid schickt per Mail einen rücksetzt-Link zu
    4. User Klickt auf den Link
    5. PyLucid schaut in der DB nach ob der rücksetzt-Link korrekt ist
    6. User kann ein neues Passwort eingeben
Im SQL Dump sind keine Klartextpasswörter erhalten. Es wird nur eine Hälfte des Klartext-Passwortes gecrypted gespeichert. Das brauche ich für den MD5-Login, siehe: MD5 Login Ablaufplan

Verfasst: Montag 4. Dezember 2006, 07:15
von Michael Schneider
jens hat geschrieben:
  • 1. User geht auf "Passwort vergessen Link"
    2. Username und EMail eintragen
    3. PyLucid schickt per Mail einen rücksetzt-Link zu
    4. User Klickt auf den Link
    5. PyLucid schaut in der DB nach ob der rücksetzt-Link korrekt ist
    6. User kann ein neues Passwort eingeben
Moin Jens,

nenn mich "blutiger Anfänger", aber kann nicht jeder, der an der Leitung snifft und die Mail abfängt, den Link genauso verwenden?
Wahrscheinlich irre ich mich, aber ich bin auf dem Gebiet tatsächlich noch Anfänger. :-)

Grüße,
der Michel

Verfasst: Montag 4. Dezember 2006, 07:45
von jens
Klar, aber was willst du dagegen tun?

Was man noch machen kann: Es wir die IP Adresse festgehalten bei der "Recovery"-Anforderung und beim anklicken des Rücksetzten-Links verglichen.

Aber der der Leitungen sniffen kann, wird wohl auch seine IP fälschen konnen.

Gegen man-in-the-middle gibt es IMHO sowieso wenig...

Verfasst: Montag 4. Dezember 2006, 10:33
von BlackJack
jens hat geschrieben:
BlackJack hat geschrieben:"Password recovery" setzt doch aber voraus, dass das Passwort irgendwo gespeichert wird!?
Nein, bloß das nicht!

Aber mal im ernst... Warum sollte man das Passwort im Klartext speichern?
Sollte man nicht. Wenn Du das nicht machst, dann solltest Du vielleicht nicht von "password recovery" reden. Unter der Wiederherstellung eines Passwortes versteht man halt üblicherweise eben genau das: das original Passwort kann wiederhergestellt werden.

Verfasst: Montag 4. Dezember 2006, 10:35
von jens
Hm... Ja da hast du wohl recht. Ich meine ehr sowas wie "Passwort reset" :)

Verfasst: Montag 4. Dezember 2006, 11:27
von jens
AHA!!! Es stimmt da doch was nicht!

Ich hab EvilEval mal auf source.pylucid.de installiert und das selbe Skript ausprobiert!

Also spinne ich doch nicht so ganz ;)

Nun muß ich die Unterschiede mal näher ein Kreisen:

Code: Alles auswählen

import random, md5
print "RND:",
for i in xrange(10):
   print random.Random(i).randint(0, 127),

print "\nmd5:", md5.new("password").hexdigest()

print "XOR:", ord("a"), 97^3, chr(ord("a") ^ 3)

print "-"*79

from PyLucid.system import crypt

key = "TestKey"
msg = "Das ist ein dummer Text"

encrypted = crypt.encrypt(msg, key)
print encrypted, hash(encrypted)
print crypt.decrypt(encrypted, key)

print "-"*79

crypt.__test_old_decrypt__()
raus kommt auf source.pylucid.de:

Code: Alles auswählen

RND: 108 17 122 30 30 79 101 41 29 59 
md5: 5f4dcc3b5aa765d61d8327deb882cf99
XOR: 97 98 b
-------------------------------------------------------------------------------
okwRlzA+AwKamlSRQQkZRkosQGoMLAo1DGlMCzdJNTFrPxMeACcK -9130123997626601219
Das ist ein dummer Text
-------------------------------------------------------------------------------
__________________________________________________________________
	old decrypt implementation test:
Test Data ok: True
Traceback (most recent call last):
  File "", line 23, in ?
  File "/var/www/jedie/bin/source.pylucid.de/PyLucid/system/crypt.py", line 191, in __test_old_decrypt__
    d = decrypt(old_crypt_value, password, use_bz2=False)
  File "/var/www/jedie/bin/source.pylucid.de/PyLucid/system/crypt.py", line 148, in decrypt
    txt = __old_hast_test(txt)
  File "/var/www/jedie/bin/source.pylucid.de/PyLucid/system/crypt.py", line 114, in __old_hast_test
    raise WrongChecksum("hash value split failed (%s) '%s'" % (e,txt))
WrongChecksum: hash value split failed (need more than 1 value to unpack) 'qnJ/e1(|~"pQvYZy[
BB AfIJiK
Das selbe Skript liefert auf pylucid.org das:

Code: Alles auswählen

RND: 108 17 122 30 30 79 101 41 29 59 
md5: 5f4dcc3b5aa765d61d8327deb882cf99
XOR: 97 98 b
-------------------------------------------------------------------------------
yVljhgh0UwKKz2GMUTs5BSE5Mns0Zlo1HDx5Fid7FXIAKmEPOG1a -734220794
Das ist ein dummer Text
-------------------------------------------------------------------------------
__________________________________________________________________
	old decrypt implementation test:
Test Data ok: True
encrypt test: True
Wie man aber sehen kann, liegt es wohl nicht an random, md5 oder XOR... An was nur dann?

Verfasst: Montag 4. Dezember 2006, 11:33
von jens
HA! Und es liegt doch an Random!

Code: Alles auswählen

import random

for a in "Dies ist ein dummer Beispieltext...":
    print random.Random(a).randint(0, 127),
liefert auf Python v2.3.5 (#2, Oct 16 2006, 19:19:48) [GCC 3.3.5 (Debian 1:3.3.5-13)] das:
102 22 77 82 47 22 82 22 47 77 22 46 47 72 71 101 101 77 81 47 41 77 22 82 19 22 77 36 22 77 62 22 99 99 99
auf Python v2.4.3 (#2, Oct 6 2006, 07:49:22) [GCC 4.0.3 (Ubuntu 4.0.3-1ubuntu5)] aber was anderes:
95 43 1 20 47 43 20 7 47 1 43 96 47 17 103 46 46 1 71 47 10 1 43 20 38 43 1 36 7 1 68 7 116 116 116
EDIT: selbst mit dem folgenden Code kommen unterschiedliche Werte raus:

Code: Alles auswählen

import random

for a in "Dies ist ein dummer Beispieltext...":
    print random.WichmannHill(a).randint(0, 127),

Verfasst: Montag 4. Dezember 2006, 11:53
von BlackJack
So ganz unabhängig sind die Ergebnisse aber nicht, das fällt besonders an den drei letzten Werten auf, scheint aber für alle zu gelten.

Verfasst: Montag 4. Dezember 2006, 12:53
von Y0Gi
FYI: Unter 2.5 bekomme ich das gleiche Ergebnis wie jens unter 2.3.5.

Verfasst: Montag 4. Dezember 2006, 15:12
von jens
Eine Lösung die mir spontan einfällt... Ich greife garnicht auf random zurück, sondern speicher die random zahlen feste als Liste in meinem Skript.

Wäre erstmal ein schneller work-a-round...

Naja, mal sehen...

Verfasst: Montag 4. Dezember 2006, 18:11
von jens
Hab ein wenig rumprobiert, aber das ganze ist nicht ganz so einfach, weil z.Z. das encoding nicht klar in crypt.py geregelt ist :(

Von daher lasse ich das doch erstmal sein und verschiebe das Thema auf die nächste PyLucid Release... Dann kann man halt z.Z. Probleme beim Serverumzug bekommen...

Verfasst: Montag 4. Dezember 2006, 19:26
von Michael Schneider
Hi,

ich weiß, das ist nur Pseudo-Zufall, aber die letzten drei Zahlen sehen an sich schon nicht nach Zufall aus, und wenn man dann noch beide Zeilen vergleicht...

Michael