Passwortabfrage Python

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.
Antworten
Poirot
User
Beiträge: 7
Registriert: Mittwoch 15. Juni 2016, 19:45

Hallo,
ich habe folgendes Problem: Ich habe ein E-Mail Programm in Python geschrieben und einige meiner freunde möchten dieses Programm mitbenutzen. Um E-Mail's mit Python verschicken zu können muss man E-Mail und Passwort angeben. Nun möchte ich bei der Eingabe des Passworts anstelle des Passworts ***** ausgeben. Dies ist leider ein größeres Problem als ich dachte :oops:

Ich bin über jede Hilfe froh. :D

LG Poirot
BlackJack

@Poirot: Schau Dir mal das `getpass`-Modul an.
Poirot
User
Beiträge: 7
Registriert: Mittwoch 15. Juni 2016, 19:45

BlackJack hat geschrieben:@Poirot: Schau Dir mal das `getpass`-Modul an.
Diese Funktion ist nützlich für passwörter ja aber ich weiß nicht wie ich damit die eingegebenen Zeichen durch * ersetzen kann.

Falls es denoch möglich ist wäre ein Beispiel sehr hilfreich.

LG Poirot
Citral
User
Beiträge: 12
Registriert: Dienstag 7. Juni 2016, 04:27
Kontaktdaten:

Poirot hat geschrieben:
BlackJack hat geschrieben:@Poirot: Schau Dir mal das `getpass`-Modul an.
Diese Funktion ist nützlich für passwörter ja aber ich weiß nicht wie ich damit die eingegebenen Zeichen durch * ersetzen kann.

Falls es denoch möglich ist wäre ein Beispiel sehr hilfreich.

LG Poirot
Da es mich auch interessiert, habe ich mal bisschen gegoogelt.

Code: Alles auswählen

import getpass
p = getpass.getpass(prompt='Password:', stream=None)

print(p)

In pycharm bekomm ich nen Fehler zurück ist aber noch auszuführen, aber Passwort sichtbar.
GetPassWarning: Can not control echo on the terminal.
passwd = fallback_getpass(prompt, stream)
Warning: Password input may be echoed.
Password:
Per ubuntukonsole sehe ich wie Linuxtypisch kein Passwort. evt. werden in Windows Sternchen angezeigt.

Bild
Poirot
User
Beiträge: 7
Registriert: Mittwoch 15. Juni 2016, 19:45

Das ist ja schon mal ein guter Anfang @Citral. Wenn man das Programm bei Windows mit der Konsole und nicht mit IDLE ausführt wird auch anstelle der normalen Eingabe einfach nichts angegeben. Das kann allerdings verwirrend werden wenn man sich verschrieben hat und nicht weis wie viele Zeichen es sind.

War trotzdem eine große Hilfe :D

LG Poirot
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hier wird beschrieben wie man Sterne bei der Passwortabfrage unter Windows anzeigen kann:

http://stackoverflow.com/a/16670956
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Variante, wie ich sie schreiben würde:

Code: Alles auswählen

import getpass
import sys

try:
    import msvcrt
except ImportError:
    msvcrt = None

def get_password(prompt='Password: ', stream=sys.stderr, asterisk=False):
    if not asterisk or not msvcrt:
        return getpass.getpass(prompt, stream)
    stream.write(prompt)
    stream.flush()
    password = []
    while True:
        character = msvcrt.getwch()
        if character == '\003':
            raise KeyboardInterrupt
        elif character in ('\r', '\n'):
            stream.write('\r\n')
            break
        elif character == '\b' and password:
            password.pop()
            stream.write('\b \b')
        else:
            password.append(character)
            stream.write('*')
        stream.flush()
    return ''.join(password)
Wobei hier der asterisk-Parameter nur unter Windows beachtet wird.
Poirot
User
Beiträge: 7
Registriert: Mittwoch 15. Juni 2016, 19:45

snafu hat geschrieben:Variante, wie ich sie schreiben würde:

Code: Alles auswählen

import getpass
import sys

try:
    import msvcrt
except ImportError:
    msvcrt = None

def get_password(prompt='Password: ', stream=sys.stderr, asterisk=False):
    if not asterisk or not msvcrt:
        return getpass.getpass(prompt, stream)
    stream.write(prompt)
    stream.flush()
    password = []
    while True:
        character = msvcrt.getwch()
        if character == '\003':
            raise KeyboardInterrupt
        elif character in ('\r', '\n'):
            stream.write('\r\n')
            break
        elif character == '\b' and password:
            password.pop()
            stream.write('\b \b')
        else:
            password.append(character)
            stream.write('*')
        stream.flush()
    return ''.join(password)
Wobei hier der asterisk-Parameter nur unter Windows beachtet wird.
Ich muss ganz ehrlich sagen das ich aus diesem Code nicht schlau werde :K. Bin noch Programmier Anfänger bzw behersche die Grundkenntnisse das hier ist mir leider viel zu hoch :(

Wenn du es evt. erklären könntest wäre mir sehr weitergeholfen :)
BlackJack

@Poirot: Wo liegt denn das Problem beim Verständnis? Da wird nichts wirklich exotisches verwendet, und was verwendet wird sollte man alles nachlesen können, wenn man es nicht versteht.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Poirot hat geschrieben:Ich muss ganz ehrlich sagen das ich aus diesem Code nicht schlau werde :K. Bin noch Programmier Anfänger bzw beherrsche die Grundkenntnisse das hier ist mir leider viel zu hoch :(
Du magst den Code nicht verstehen aber mit deinen Grundkenntnissen dürftest es nicht schon an der ersten Zeile scheitern. Geh Zeile für Zeile den Code durch und sobald du auf eine stößt die du nicht verstehst, frag was da passiert. Darauf kann man dann auch sinnvoll und effizient antworten.
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

snafu hat geschrieben:Variante, wie ich sie schreiben würde
Wobei hier der asterisk-Parameter nur unter Windows beachtet wird.
Anscheinend ist auch das msvcrt Modul nur Windows/DOS only - beim Rest wird deine Variante normal getpass benutzen. Schön!

Wieso ist asterisk default False?
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Kebap hat geschrieben:Anscheinend ist auch das msvcrt Modul nur Windows/DOS only - beim Rest wird deine Variante normal getpass benutzen.
Richtig, es handelt sich dabei um eine reine Windows-Schnittstelle. Daher ist ja auch die Sonderbehandlung nötig, denn der Code für Unix-Terminals funktioniert unter Windows nicht.
Kebap hat geschrieben:Wieso ist asterisk default False?
Ich wollte mit dem Standardverhalten nahe am Python-eigenen getpass() sein.
Antworten