eine art Passwortdatenbank

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Jathon
User
Beiträge: 6
Registriert: Sonntag 30. März 2008, 17:30
Kontaktdaten:

Sonntag 30. März 2008, 18:51

Mein erstes Posting in diesem tollen Forum, deswegen erst einmal:
Hallo Forum :D

Das Programm (http://paste.pocoo.org/show/36534/) soll ein Passwort aus einem Namen und einer Zahl "erzeugen". Allerdings ist dieses Passwort immer das selbe, wenn man den gleichen Daten eingibt. Deswegen ist es eine art Passwortdatenbank - nur halt dass die Passwörter nicht gespeichert werden.

Ich hatte die Idee als ich ein bisschen mit TrueCrypt gespielt habe. Da ich kein Keyfile haben wollte, dass nach einer minimalen Byte-Änderung nicht mehr brauchbar ist und mir kein extrem langes Passwort mit vielen Sonderzeichen merken wollte, hab ich dieses Programm geschrieben - also eigentlich alles nur aus Faulheit :P

Ich selbst bin übrigens Python-Anfänger - aber das erkennt man bestimmt auch am code :P

So nun überlass ich das Feld den Kritikern :wink:
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 30. März 2008, 19:04

Hallo Jathon,
Jathon hat geschrieben:Ich selbst bin übrigens Python-Anfänger - aber das erkennt man bestimmt auch am code :P
Ja. Ich bitte um eine fassung mit 100% weniger Magic Numbers.

Ansonsten: PEP8 beachten, kleinere Funktionen mit festgelegter Funktionalität, brauchbare Kommentare. Rautenkunstwerke sind keine brauchbaren Kommentare. Ich habe eigentlich gar keine Lust deinen Code nachzuvollziehen, da es schneller geht ihn neu zu schreiben. Wenn Code zu kompliziert wird, ist es oftmals sinnvoll, Objekte einzusetzen. Das habe ich mal am Playfair-Beispiel hier im Forum gemacht, welches aussah wie dein Programm nur mit anderen Magischen Zahlen und herausgekommen ist etwas recht interessantes (auch nicht trivial, aber statt die Zahlen verstehen zu müssen, musste man nur die Funktionen und Objekte verstehen, was wesentlich einfacher ist weil man es nachschlagen kann).

Einen String umdrehen geht übrigens mit ``''.join(reversed("dein string"))`` bzw. ``''.join("dein string"[::-1])``.

Notiz an mich: Code-Beispiele öfter vorher ausprobieren.
Zuletzt geändert von Leonidas am Sonntag 30. März 2008, 21:59, insgesamt 1-mal geändert.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Sonntag 30. März 2008, 21:27

Leonidas hat geschrieben:Einen String umgrehen geht übrigens mit [...] ``''.join("dein string"[::-1])``.
``'dein string'[::-1]`` tut's auch.
Jathon
User
Beiträge: 6
Registriert: Sonntag 30. März 2008, 17:30
Kontaktdaten:

Montag 31. März 2008, 01:00

Ich bedanke mich für die schnellen Antworten mit Kritik und Tipps :D

Habe eben schnell versucht eine anschaulichere Dokumentation des Programmes zu schreiben und ich habe meine String-dreh Funktion entfernt

...aber wie das mit den magic numbers gemeint war versteh ich leider nicht so wirklich...

...habe aber trotzdem auch in den umwandlungs Bereichen etwas umgeschrieben...und mit einer Definition getestet wie viele Variationen der erstellte String hat.

hier der Link zum neuen Code:
http://paste.pocoo.org/show/36576/

achja... da ich davon ausgehe das meine Kommentare immer noch kein gefallen finden werden, wäre es net wenn ihr mir ein paar Tipps geben könntet.

habe bis jetzt leider erst ein paar Tutorials in english durchgearbeitet ... und da stand nicht sonderlich viel über das Thema...

so nun hoffe ich auf weitere Kritik und Tipps zu stoßen :P
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Montag 31. März 2008, 01:23

Das tut ungefähr dies hier, oder?
http://paste.pocoo.org/show/36586

Zu den Magic Numbers:
[url]hhttp://de.wikipedia.org/wiki/Magische_Zahl_%28Informatik%29[/url]

Von wegen deiner Kommentare:
Erkläre, warum du ein Problem so löst, wie du es tust. Es geht um die Intention hinter dem Code, nicht um eine Nacherzählung ;)
Jathon
User
Beiträge: 6
Registriert: Sonntag 30. März 2008, 17:30
Kontaktdaten:

Montag 31. März 2008, 02:14

ok ohne Kommentare xD ist mir sowieso Lieber :P

http://paste.pocoo.org/show/36586
naja... im grunde... ist es irgenwie so...
nur halt das ich das ganze nicht nur im Hexadezimalen-System ausdrücken will, ausserdem kann man - zwar nur durch ausprobieren, aber man kann es - das Endpasswort trimmen (mit der eingegebenen zahl)

...die Zahlen sind nach meiner ansicht sinnvoll... deswegen versteh ich es leider nicht

also das warum ich die Idee hatte habe ich ja versucht am Anfang des Threads zu erklären...
also führe ich nun dort fort wo ich aufgehöhrt hatte:
Ich wollte mit einem einfachen Passwort zuerst ein gutes Passwort erzeugen - kurz darauf kam die Zahl ins Spiel weil das Passwort zu lang wurde und ich eine "individuelle" Modula-Funktion haben wollte.
Leider viel mir keine Möglichkeit ein ohne den "Zufall" einzusetzen gute Passwörter zu kreiern, ausser jedes Zeichen der Zeichenkette in eine einzelne Zahl umzuwandeln und diese z.t. auf mehrere Milliarden hoch zu multiplizieren und wieder klein zu dividiren sodass ich sie per chr() in einen Charakter zurück wandeln konnte. Das war von nöten weil ein Sicheres Passwort nunmal nicht nur aus Zahlen bestehen sollte... deswegen auch die unübersichtlichkeit und *glaube* auch die magic number anmerkung zum ersten Code den ich gepostet hatte - im Zweiten habe ich das ganze überarbeitet.
Ausserdem war es ein gutes Anfänger-Training :P

Aber im groben un ganzen ist das Programm ja eigentlich sinnvoll da es mit zwei einfach zu merkenden Kennwörtern ein sehr komplexes Passwort erstellen kann...die Idee ist doch eigentlich gut oder? (dass das Programm stark Verbesserungswürdig ist um als wirklich Ideen-Konform zu gelten ist mir klar - ist ja auch eine Beta :P )
aber ich schätze mal das diese Idee auch uralt ist...aber es ist nicht wie eine Textveschlüsslung da das Orginal nicht wieder erstellt werden kann
- ich wollte ja kein Römer sein :P

ich hoffe ich habe nichts wichtiges vergesen zu erwähnen - sonst los brüllen :wink:
BlackJack

Montag 31. März 2008, 08:29

Zu den magischen Zahlen: Der Kritikpunkt ist nicht, dass die Werte nicht sinnvoll sind, sondern das man solche Zahlen nicht überall im Programm verstreut literal verwenden sollte, sondern für jeden Wert, oder zumindest für jeden, der mehr als einmal verwendet wird, eine Konstante definiert und dort auch dokumentiert was sie bedeutet.

Ansonsten würde ich Dein Programm nicht benutzen, weil ich etablierten Hash-Funktionen einfach mehr vertraue als so etwas selbst gebasteltem. Gerade bei Passworten.

Wenn Du mehr als die Zeichen für Hexadezimalzahlen im Ergebnis haben möchtest, kannst Du auch einfach eine Funktion schreiben, die das Ergebnis des Hash-Algorithmus in andere Buchstaben und Ziffern umwandelt.
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 31. März 2008, 10:38

Mal was generelles:

Code: Alles auswählen

for i in s[:]:
Was soll das [:] ? Kann man weglassen

Code: Alles auswählen

    e=""
    e=algo2(d,d2,s,s2,g)
Man muß e nicht vorher definieren. e="" ist also überflüssig.

Code: Alles auswählen

    for i in range(len(s1)):
        i2=ord(s1[i])#wert von Zeichenkette[i]
Das ist zu umständlich.
Wenn du die Position im Text nicht brauchst, sondern einfach nur Buchstabe pro Buchstabe brauchst, reicht ein "for char in s1:"
Brauchst du den Buchstaben und die Position könnte man es so machen: "for char,pos in enumerate(s1):"

Code: Alles auswählen

z1=int((i2*(k2**((i2*k2)/(k2**2))))/(i2-k2))#Rechnung
Hier dürfte int() überflüssig sein.

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

Montag 31. März 2008, 11:39

Ausserdem kann man die Rechnung noch ein wenig vereinfachen:

Code: Alles auswählen

z1 = (i2 * k2**(i2 // k2)) // (i2 - k2)
Jathon
User
Beiträge: 6
Registriert: Sonntag 30. März 2008, 17:30
Kontaktdaten:

Montag 31. März 2008, 21:00

so hab mein Programm - ok meine Beta im Alphastadium - wieder ziemlich umgeschrieben
http://paste.pocoo.org/show/36721/

das Ergebnis der Änderungen ist, dass sich nun frühsten nach 92 Zeichen sich ein Zeichen ähnelt... leider habe ich auch herausgefunden das sich bei manchen Eingaben(1mal von 50) das Programm aufhängt (vielleicht hat es noch gerechnet - habe nach ca 10sec abgebrochen)

habe auch die magic numbers entfernt...

danke BlackJack für die Tipps

-mit der Hash-Funktion hätte ich das jetzt natürlich machen können - aber... das mach ich erst nachdem ich mein Python-Buch durchgelesen habe - dann kann ich mich nämlich besser über mein Programm amüsieren xD

-das mit dem Vertrauen ist klar^^ ich vertrau meinem Programm ja auch nicht :P
- ok inzwischen kann ich es für mich alleine benutzen, aber für die "Massen-Produktion" ist es nicht geeignet

-und ja die Rechnung war falsch... kürzt sich ja weg...


@jens danke auch für deine Tipps

ja das mit den Deklarationen bin ich nicht so gewohnt von Java her
for char,pos in enumerate(s1):
danke für den Tipp, aber kann ich in diesem Fall nicht gebrauchen da:
1. ich nur einmal den jetzigen Char benötige
2. wäre ja eine unnötige Variable wenn ich sie nur einmal benutze
3. würde insgesamt einfach länger und umständlicher sein
aber ist auf jedenfall merkenswert


sieht der Quellcode nun besser aus?
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 31. März 2008, 21:21

Jathon hat geschrieben:
for char,pos in enumerate(s1):
danke für den Tipp, aber kann ich in diesem Fall nicht gebrauchen da:
Ich verstehe deinen Code zwar nicht wirklich, aber das hier geht mit dem obrigen besser:
Original:

Code: Alles auswählen

    for i in range(len(zs1)):
        i2=ord(zs1[i])#wert von Zeichenkette[i] 
        for k in range(len(zs2)):
            k2=ord(zs2[k])#wert von umgedrehter Zeichenktette[k]
das selbe mit enumerate():

Code: Alles auswählen

for pos1, char1 in enumerate(zs1):
    i2=ord(char1)
    for pos2, char2 in enumerate(zs2):
        k2=ord(char2)
pos1 ist also dein i und pos2 dein k. die Verwendest du ja später.

Generell würde ich die variablen besser benennen. Man muß erst in die Kommentare schauen, damit man weiß was was ist ;)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Jathon
User
Beiträge: 6
Registriert: Sonntag 30. März 2008, 17:30
Kontaktdaten:

Montag 31. März 2008, 21:32

Ja aber für einmal ist es nicht sonderlich lohnenswert...
wenn ich den char 2mal in Zukunft benötige werde, ich deine Methode natürlich immer vorziehen ;)
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 31. März 2008, 21:46

Jetzt verstehe ich was du mit einmalig meinst. Das ist IMHO kein Grund. Sieht nicht der enumerate code viel besser aus? Ist doch viel einfacher zu verstehen.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Jathon
User
Beiträge: 6
Registriert: Sonntag 30. März 2008, 17:30
Kontaktdaten:

Montag 31. März 2008, 22:13

hm... scheint dir anscheinend ziemlich wichtig zu sein das man das so macht... und da ich der Anfänger bin sollte ich dir doch einmal nachgeben :P

damit die Nachwelt mich besser versteht hab ichs mal geändert ;)
http://paste.pocoo.org/show/36724/
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Montag 31. März 2008, 22:32

Fürs debuggen bietet sich übrigens das `logging`-Modul aus der Standardbibliothek an.
Antworten