Passwort aus Datei auslesen und vergleichen

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.
mr-evil1
User
Beiträge: 35
Registriert: Montag 11. März 2019, 10:48

Hallo. Hab ein kleines Anliegen.

Ich habe eine Datei "pass.text"

Darin befinden sich viele Passwörter ca.100.. Jedes Passwort ist getrennt durch ;

In meinem Code möchte ich nun diese Passwörte aus der Datei mit dem Passwort der Tastatureingabe vergleichen.
Wenn das Passwort der Tastatureingabe mit einem Passwort in der Datei übereinstimmt darf erst der Nächste Schritt eingeleitet werden.
Sonnst wieder zurück in die EINGABE.

Der bestehende Code funktioniert bereits mit der internen abfrage in der .py Datei.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Hier steht die Lösung.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Benutzeravatar
sparrow
User
Beiträge: 4361
Registriert: Freitag 17. April 2009, 10:28

Dann zeig doch was du hast, was du versucht hast und was nicht funktioniert.
Aus deiner Beschreibung kann ja niemand den Ist-Zustand herauslesen.
mr-evil1
User
Beiträge: 35
Registriert: Montag 11. März 2019, 10:48

Das funktioniert soweit

Code: Alles auswählen


def main():
		count = 0
		while count < 3:
				kb = xbmc.Keyboard('default', 'heading', True)
				kb.setDefault()
				if count == 0:
						kb.setHeading('Enter Password, 3 Versuche')
				if count == 1:
						kb.setHeading('Enter Password, noch 2 Versuche')
				if count == 2:
						kb.setHeading('Enter Password, letzter Versuch')
				kb.setHiddenInput(True)
				kb.doModal()
				while kb.isConfirmed():
						passwordHash = '123'
						password_input = kb.getText()
						break
				else:
						xbmc.executebuiltin('Quit')
				if passwordHash == password_input:
						print("Zugang gewaehrt")
						from lib import startup
						startup.show()
						break
				else:
						count = count+1
		else:
				xbmc.executebuiltin('Quit')

Nur scheitere ich immer an der abfage aus einer Datei.
Sirius3
User
Beiträge: 18051
Registriert: Sonntag 21. Oktober 2012, 17:20

Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht 2 Tabs. So ist der Code kaum lesbar.
Die äußere while-Schleife ist eigentlich eine for-Schleife, am besten über den Text, den Du als Heading ausgeben willst. Die innere while-Schleife ist Quatsch, weil Du sie immer sofort per ›break‹ verläßt.
Ich glaube kaum, dass jemand direkt einen Passwort-Hash eingibt, der Variablenname ist irreführend, oder besser gesagt Wunschtraum, weil Passwörter tatsächlich nur als Hash gespeichert werden sollten.
Importe sollten am Anfang der Datei stehen, nicht mittendrin. Der Paketname `lib` ist zu generell, da solltest Du einen besseren Namen finden.

Zum eigentlichen Problem hast Du jetzt gar nichts gezeigt. Da das Problem unabhängig von Deiner Eingabeoberfläche ist, kannst Du es als Funktion schreiben.
Die Funktion sollte die Datei lesen, mit dem als Argument übergebenen Passwort vergleichen und True oder False zurückgeben. Wo hast Du damit ein konkretes Problem?
Mir fehlt da auch noch ein Benutzernamen.
Benutzeravatar
__blackjack__
User
Beiträge: 13533
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Die Kritikpunkte mal grösstenteils umgesetzt könnte das so aussehen (ungetestet):

Code: Alles auswählen

import xbmc
from lib import startup

EXPECTED_PASSWORD = '123'


def main():
    for heading in ['3 Versuche', 'noch 2 Versuche', 'letzter Versuch']:
        keyboard = xbmc.Keyboard('default', 'heading', True)
        keyboard.setDefault()
        keyboard.setHeading('Enter Password, ' + heading)
        keyboard.setHiddenInput(True)
        keyboard.doModal()
        if keyboard.isConfirmed():
            password = keyboard.getText()
        else:
            xbmc.executebuiltin('Quit')

        if password == EXPECTED_PASSWORD:
            print('Zugang gewaehrt')
            startup.show()
            break
    else:
        xbmc.executebuiltin('Quit')

Code: Alles auswählen

- (void)countSheep {
    unsigned int sheep = 0;
    while ( ! [self isAsleep]) { ++sheep; }
}
mr-evil1
User
Beiträge: 35
Registriert: Montag 11. März 2019, 10:48

Ersmal vielen Dank für eure Hilfe.
Sehr schöner Code. Was jedoch nicht funktioniert, wenn die eingabe falsch ist, dass er den counter hochzählt.

Wie gesagt, würde ich nur gerne anstelle " EXPECTED_PASSWORD = '123' "
das oder die Passwörter aus einer Datei, zB: pass.csv auslesen und vergleichen.

das csv modul habe ich mir auch angesehen, jedoch komme ich damit noch nicht zurecht..
Benutzeravatar
__blackjack__
User
Beiträge: 13533
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@mr-evil1: Welcher counter? Es gibt keinen mehr, weil man den nicht braucht.

Code: Alles auswählen

- (void)countSheep {
    unsigned int sheep = 0;
    while ( ! [self isAsleep]) { ++sheep; }
}
mr-evil1
User
Beiträge: 35
Registriert: Montag 11. März 2019, 10:48

Bei deinem Code, zählt er nicht runter.
Das heisst, wenn ich falsche eingabe mache, "noch 2 Versuche" noch mal probieren und Falsch, "Nur noch 1 Versuch" usw...

Oder bin ich auf dem Holzweg?
Benutzeravatar
__blackjack__
User
Beiträge: 13533
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@mr-evil1: Ja, Du bist auf dem Holzweg. Man muss da weder rauf noch runter zählen. Die Texte stehen in der Liste und die Schleife geht über diese Liste, also gibt's in jedem Schleifendurchlauf den passenden Text.

Code: Alles auswählen

- (void)countSheep {
    unsigned int sheep = 0;
    while ( ! [self isAsleep]) { ++sheep; }
}
mr-evil1
User
Beiträge: 35
Registriert: Montag 11. März 2019, 10:48

Nochmal getestet. Läuft so bei mir leider nicht.
Sirius3
User
Beiträge: 18051
Registriert: Sonntag 21. Oktober 2012, 17:20

„Läuft nicht” ist eine sehr schlechte Fehlerbeschreibung. Was passiert? Fehlermeldung?
Und wo kommst Du nun konkret nicht weiter mit dem Lesen Deiner Passwortdatei?
mr-evil1
User
Beiträge: 35
Registriert: Montag 11. März 2019, 10:48

Beim letzten Code wird die Schleife und das Programm nach der erste Fehleingabe beendet. Bei meinem Code ganz oben nicht.
Eigentlich bräuchte ich nur einen Passwort Abgleich aus einer externen Datei.
Benutzeravatar
__blackjack__
User
Beiträge: 13533
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@mr-evil1: Mit welcher Fehlermeldung wird es denn *im* ersten Schleifendurchlauf beendet? Denn das sollte genau so gehen wie es da steht. Das ``break`` wird *nicht* bei einer Fehleingabe erreicht, also musst Du ja irgendeine Fehlermeldung bekommen, da sonst die Schleife nicht verlassen wird.

Code: Alles auswählen

- (void)countSheep {
    unsigned int sheep = 0;
    while ( ! [self isAsleep]) { ++sheep; }
}
mr-evil1
User
Beiträge: 35
Registriert: Montag 11. März 2019, 10:48

Anzumerken ist, dass es sich dabei um Kodi handelt.
Benutzeravatar
__blackjack__
User
Beiträge: 13533
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@mr-evil1: Das hat das `xbmc`-Modul schon irgendwie verraten – und das ändert nichts daran wie die Programmiersprache Python funktioniert.

Code: Alles auswählen

- (void)countSheep {
    unsigned int sheep = 0;
    while ( ! [self isAsleep]) { ++sheep; }
}
mr-evil1
User
Beiträge: 35
Registriert: Montag 11. März 2019, 10:48

Also ist es nicht möglich, Passwörter aus einer passw.csv Datei auszulesen und mit der Tastatureingabe zu vergleichen?
Hab schon vieles versucht. Es funktioniert aber nur immer mit dem ersten Wort in der Datei.

ZB passw.csv:

123;345;678;91011;121314 ;

Ich hätte gerne dass alle diese zu einem Password = True führen
Und alles was nicht in der Liste ist zu eunem Password = False

Ich schaffe es einfach nicht. Habe schon alle Firen danach abgesucht.
Benutzeravatar
sparrow
User
Beiträge: 4361
Registriert: Freitag 17. April 2009, 10:28

Beantworte doch erst einmal __blackjacks__ Frage warum sein Code nicht funktioniert.
Man baut ja ein Haus auf einem vernünftigen Fundament.

Und dann dann zeigst du den Code, der nur das erste Passwort akzeptiert.

Solange du hier alles ignorierst, was die helfen soll, wirst du auch nicht voran kommen.
Sirius3
User
Beiträge: 18051
Registriert: Sonntag 21. Oktober 2012, 17:20

NAtürlich ist das möglich. Aber Du hast noch immer nicht gezeigt, was Du bereits versucht hast.
Ein Problem teilt man am besten in kleine Teilprobleme, die einfach zu lösen sind. Hier ist es, das Lesen der Passwortdatei, und das vergleichen mit vielen Passwörtern.
mr-evil1
User
Beiträge: 35
Registriert: Montag 11. März 2019, 10:48

Ok. Hier ein Beispiel von mir, aus der Konsole mit nur 4 Passwörter aus der Datei.

Code: Alles auswählen

import csv
answer = input("Do you have an account?(yes or no) ")
if answer == 'yes' :
    login = False
    csvfile = open("/storage/emulated/0/passw.csv","r")
    reader = csv.reader(csvfile, delimiter=';')
    for row in reader:
        for heading in ['password: ', '2 more attempts:   ', 'last attempt:   ']:
            password = input(heading)
            if row[0] == password:
                login = True
                break
            elif row[1] == password:
                login = True
                break
            elif row[2] == password:
                login = True
                break
            elif row[3] == password:
                login = True
                break
            else:
                login = False
        if login == True:
            print("You are now logged in!")
            break
        else:
            print("3 times incorrect password.")
            exit()
else:
    print('Only with password.')
    exit()
Antworten