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
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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?

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

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
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

Das wird es wohl sein :(

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

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/
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

"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

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
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
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.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

FYI: Unter 2.5 bekomme ich das gleiche Ergebnis wie jens unter 2.3.5.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Antworten