random.Random() liefert unterschiedliche Ausgaben???

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

random.Random() liefert unterschiedliche Ausgaben???

Beitragvon jens » Sonntag 3. Dezember 2006, 13:02

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?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Sonntag 3. Dezember 2006, 13:36

Wie immer ist Dokumentation lesen aufschlussreich: http://docs.python.org/lib/module-random.html, 7. Absatz.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Sonntag 3. Dezember 2006, 13:40

Ja, du meinst:
Changed in version 2.3: Substituted MersenneTwister for Wichmann-Hill.

oder?

Das wird es wohl sein :(

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Sonntag 3. Dezember 2006, 13:44

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Sonntag 3. Dezember 2006, 13:58

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
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Sonntag 3. Dezember 2006, 17:46

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.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Beitragvon BlackJack » Sonntag 3. Dezember 2006, 18:39

"Password recovery" setzt doch aber voraus, dass das Passwort irgendwo gespeichert wird!?
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Sonntag 3. Dezember 2006, 22:30

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Montag 4. Dezember 2006, 06:49

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Michael Schneider
User
Beiträge: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Beitragvon Michael Schneider » Montag 4. Dezember 2006, 07:15

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Montag 4. Dezember 2006, 07:45

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...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Beitragvon BlackJack » Montag 4. Dezember 2006, 10:33

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.
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Montag 4. Dezember 2006, 10:35

Hm... Ja da hast du wohl recht. Ich meine ehr sowas wie "Passwort reset" :)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Montag 4. Dezember 2006, 11:27

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?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Montag 4. Dezember 2006, 11:33

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),

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot], Nebeig