Mein erstes Posting in diesem tollen Forum, deswegen erst einmal:
Hallo Forum
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
Ich selbst bin übrigens Python-Anfänger - aber das erkennt man bestimmt auch am code
So nun überlass ich das Feld den Kritikern
eine art Passwortdatenbank
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Hallo Jathon,
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.
Ja. Ich bitte um eine fassung mit 100% weniger Magic Numbers.Jathon hat geschrieben:Ich selbst bin übrigens Python-Anfänger - aber das erkennt man bestimmt auch am code
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 (former) Modvoice
Ich bedanke mich für die schnellen Antworten mit Kritik und Tipps
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
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
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
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
ok ohne Kommentare xD ist mir sowieso Lieber
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
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 )
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
ich hoffe ich habe nichts wichtiges vergesen zu erwähnen - sonst los brüllen
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
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 )
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
ich hoffe ich habe nichts wichtiges vergesen zu erwähnen - sonst los brüllen
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.
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.
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Mal was generelles:
Was soll das [:] ? Kann man weglassen
Man muß e nicht vorher definieren. e="" ist also überflüssig.
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):"
Hier dürfte int() überflüssig sein.
Code: Alles auswählen
for i in s[:]:
Code: Alles auswählen
e=""
e=algo2(d,d2,s,s2,g)
Code: Alles auswählen
for i in range(len(s1)):
i2=ord(s1[i])#wert von Zeichenkette[i]
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
Ausserdem kann man die Rechnung noch ein wenig vereinfachen:
Code: Alles auswählen
z1 = (i2 * k2**(i2 // k2)) // (i2 - k2)
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
- 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
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?
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
- 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
danke für den Tipp, aber kann ich in diesem Fall nicht gebrauchen da:for char,pos in enumerate(s1):
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?
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Ich verstehe deinen Code zwar nicht wirklich, aber das hier geht mit dem obrigen besser:Jathon hat geschrieben:danke für den Tipp, aber kann ich in diesem Fall nicht gebrauchen da:for char,pos in enumerate(s1):
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]
Code: Alles auswählen
for pos1, char1 in enumerate(zs1):
i2=ord(char1)
for pos2, char2 in enumerate(zs2):
k2=ord(char2)
Generell würde ich die variablen besser benennen. Man muß erst in die Kommentare schauen, damit man weiß was was ist
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
wenn ich den char 2mal in Zukunft benötige werde, ich deine Methode natürlich immer vorziehen
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
damit die Nachwelt mich besser versteht hab ichs mal geändert
http://paste.pocoo.org/show/36724/
damit die Nachwelt mich besser versteht hab ichs mal geändert
http://paste.pocoo.org/show/36724/