Python Nomi utente e Password

Sto cercando di creare un programma in cui è possibile creare, accedere e cancellare gli account. Ho fatto 2 liste, una con i nomi utente e una password. Lo script richiede un input e se vi dicono che il log in, si dice:

if loginchoice=='login':
    choice = raw_input("What is your username? ")
    choice2 = raw_input("What is your password? ")
    if choice in accounts:
        option1=1
    else:
        option1=0
    if choice2 in password:
        option2=1
    else:
        option2=0
    if option1==1 and option2==1:
        print "Welcome to Telemology,", choice
    else:
        print "The username or password you entered is incorrect. Please try again or register."

Come si può vedere, controlla solo per vedere se gli ingressi sono già nelle liste. Non vedere se gli ingressi hanno lo stesso indice. Non posso mettere “i conti.indice(a scelta)” perché si tratta della ‘scelta’ come un intero. Lo stesso vale per le quotazioni a causa di stringhe. Non trattarli come variabili. C’è qualche modo per aggirare questo?

Spero che se la mia domanda viene risposto, due persone non registrare simultaneamente e glitch gli indici.

OriginaleL’autore user547853 | 2010-12-19

9 Replies
  1. 2

    Quello che vuoi è una mappatura, o un dizionario. La sua chiave dovrebbe essere nome utente, il suo contenuto è la password per il nome utente.

    users = {} # this is the mapping
    users["joe"] = "123" # it currently contains username "joe" with password "123"
    ...
    username = raw_input("What is your username? ")
    password = raw_input("What is your password? ")
    if username in users.keys():
      expected_password = users[username]
      if expected_password == password:
        print "Welcome to Telemology,", username
      else:
        print "Didn't you forget your password,", username
    else:
      print "Unknown user"

    Naturalmente, in un sistema reale devi memorizzare le password salata e crittografati.

    OriginaleL’autore 9000

  2. 2

    Si dovrebbe usare il getpass modulo per assicurarsi che la password non viene visualizzata sullo schermo e il hashlib modulo a dire che il raw password non vengono memorizzate. Qui è una classe che utilizza moduli e dovrebbe funzionare su python2 e python3. Se si desidera caricare il file è necessario memorizzare il UserDB.gli utenti di attributi in un file, è possibile utilizzare json modulo per farlo.

    import getpass
    import hashlib
    import random
    import sys
    class UserDB():
        def __init__(self, users=dict(), unprompt='Username:', pwprompt='Password:'):
            self.users=dict(users)
            self.unprompt=unprompt
            self.pwprompt=pwprompt
        def adduser(self):
            if sys.version_info.major==3:
                name=input(self.unprompt)
            elif sys.version_info.major==2:
                name=raw_input(self.unprompt)
            passwd=getpass.getpass(self.pwprompt).encode('utf-8')
            salt=bytes(random.randint(30, 95) for i in range(10))
            passwd=hashlib.pbkdf2_hmac('sha512', passwd, salt, 10*10)
            self.users[name]=[salt, passwd]
        def deluser(self, name):
            del self.users[name]
        def __str__(self):
            return str(self.users)
        def __repr__(self):
            return 'UserDB(users=%s, unprompt=%s, pwprompt=%s)' % (self.users,
                                                               ascii(self.unprompt),
                                                               ascii(self.pwprompt))
        def login(self):
            if sys.version_info.major==3:
                name=input(self.unprompt)
            elif sys.version_info.major==2:
                name=raw_input(self.unprompt)
            if name not in self.users:
                return False
            passwd=getpass.getpass(self.pwprompt).encode('utf-8')
            salt=self.users[name][0]
            passwd=hashlib.pbkdf2_hmac('sha512', passwd, salt, 10*10)
            return self.users[name][1]==passwd

    OriginaleL’autore Hugh Williams

  3. 1

    Creare una lista di utenti, invece, e creare oggetti Utente, che sono nome utente e password come attributi.

    Avere due liste che sta per arrivare desincronizzato, prima o poi.

    OriginaleL’autore Lennart Regebro

  4. 1

    Poiché è login, dovrebbe essere unico, e non si può fare un dizionario:

    users = {'username':'password', ...}

    e poi verificare come questo:

    choice = raw_input("What is your username? ")
    choice2 = raw_input("What is your password? ")
    if (choice in users) and (choice2 == users[choice]):
       # valid user
    else:
       # login or password incorrect.
    Solo nel caso in cui: docs.python.org/library/stdtypes.html#dict.has_key 🙂
    Grazie, aggiornato.

    OriginaleL’autore khachik

  5. 1

    Alcuni problemi che sto vedendo:

    1. Si visualizza la password che l’utente digita.
    2. Si accetta qualsiasi nome utente e password, il che significa che ho potuto accedere a qualsiasi account con la mia password.
    3. Mai memorizzare un testo non crittografato password.

    Non ho trovato il portatile modo per non eco password. #2 è risolto con un dizionario. Come per la #3, si probabilmente desidera utilizzare il hashlib modulo:

    from hashlib import sha224
    
    PASSWORD_HASHES = {}
    
    def set_password(account, raw_password):
        PASSWORD_HASHES[account] = sha224(raw_password).digest()
    
    def authenticate(account, raw_password):
        if account not in PASSWORD_HASHES:
            return False
        return PASSWORD_HASHES[account] == sha224(raw_password).digest()

    Sostituire sha224 con qualsiasi algoritmo di hash che si desidera; non ho tenuto traccia di quelli che sono ancora buone per le password.

    EDIT: per quanto Riguarda il problema #1, se sei in un POSIX-based system (cioè non a una richiesta di Windows), è possibile utilizzare il codice di esempio da Python pagina per il termios modulo per ottenere una password senza eco sullo schermo:

    def getpass(prompt="Password: "):
        import termios, sys
        fd = sys.stdin.fileno()
        old = termios.tcgetattr(fd)
        new = termios.tcgetattr(fd)
        new[3] = new[3] & ~termios.ECHO          # lflags
        try:
            termios.tcsetattr(fd, termios.TCSADRAIN, new)
            passwd = raw_input(prompt)
        finally:
            termios.tcsetattr(fd, termios.TCSADRAIN, old)
        return passwd

    Questo non mette *‘s per i personaggi; solo sopprime ingresso. A mettere in su *‘s, è necessario gestire l’input di un carattere alla volta e scrivere il codice più.

    C’è un getpass funzione della libreria standard, e dovrebbe essere portatile: docs.python.org/library/getpass.html

    OriginaleL’autore Mike DeSimone

  6. 1

    ho una molto semplice codice che permette di ottenere due atemps a vostra password, se essi non corrispondono abituato a lavorare

        users = {}
    users["bob"] = "bob" 
    
    username = raw_input("What is your username? ")
    password = raw_input("What is your password? ")
    if username in users.keys():
      expected_password = users[username]
      if expected_password == password:
        print "Welcome to Telemology,", username
      else:
        print "Didn't you forget your password,", username
    
    password = raw_input("What is your password? ")
    if username in users.keys():
      expected_password = users["bob"]
      if expected_password == password:
        print "Welcome to Telemology,", username
        #*here
      else:
        print "Didn't you forget your password,", username
    else:
      print "Unknown user"
    #continue your code for wrong here else*

    OriginaleL’autore Jordan Bennett

  7. 0

    O si può solo db SQLite3. Che vi permetterà di aggiungere utenti e password in fase di runtime. SQLite3 fornisce anche l’hashing.

    OriginaleL’autore Pwnna

  8. 0

    Si può sempre creare un dizionario con i nomi di account e le loro rispettive password.
    dictionary={'username':'password','some other username':'some other password'}
    if dictionary[choice] == choice2:
    print 'Welcome to Telemology, %s' %choice

    OriginaleL’autore JAW

  9. 0

    Si dovrebbe cambiare l’input per la tua password per intero come segue:

    password = raw_input("What is your password? ") --->this is your code
    password = int(input("what is your password?")) --->modified code

    e quindi tutto dovrebbe funzionare.

    OriginaleL’autore user8008466

Lascia un commento