Frage

Ich bin für eine Python-Bibliothek, die mir helfen wird, eine Authentifizierungsmethode für eine Desktop-Anwendung zu erstellen schreibe ich. Ich habe mehrere Verfahren in Web-Framework gefunden wie django oder turbogears.

Ich möchte nur eine Art von Benutzername-Passwort Verband in eine lokale Datei gespeichert. Ich kann es selbst schreiben, aber ich bin es wirklich existiert bereits und wird eine bessere Lösung (ich bin nicht sehr fließend mit Verschlüsselung) sein.

War es hilfreich?

Lösung

die folgenden als Pseudo-Code Treat ..

try:
    from hashlib import sha as hasher
except ImportError:
    # You could probably exclude the try/except bit,
    # but older Python distros dont have hashlib.
    try:
        import sha as hasher
    except ImportError:
        import md5 as hasher


def hash_password(password):
    """Returns the hashed version of a string
    """
    return hasher.new( str(password) ).hexdigest()

def load_auth_file(path):
    """Loads a comma-seperated file.
    Important: make sure the username
    doesn't contain any commas!
    """
    # Open the file, or return an empty auth list.
    try:
        f = open(path)
    except IOError:
        print "Warning: auth file not found"
        return {}

    ret = {}
    for line in f.readlines():
        split_line = line.split(",")
        if len(split_line) > 2:
            print "Warning: Malformed line:"
            print split_line
            continue # skip it..
        else:
            username, password = split_line
            ret[username] = password
        #end if
    #end for
    return ret

def main():
    auth_file = "/home/blah/.myauth.txt"
    u = raw_input("Username:")
    p = raw_input("Password:") # getpass is probably better..
    if auth_file.has_key(u.strip()):
        if auth_file[u] == hash_password(p):
            # The hash matches the stored one
            print "Welcome, sir!"

Statt eine kommagetrennte Datei zu verwenden, würde ich empfehlen, SQLite3 mit (die für andere Einstellungen verwendet werden könnten, und so weiter.

Beachten Sie auch, dass dies nicht sehr sicher ist - wenn die Anwendung lokal ist, könnte böser Benutzer wahrscheinlich ersetzen Sie einfach die ~/.myauth.txt Datei .. Die lokale Anwendung Auth ist schwierig, gut zu tun. Sie werden alle Daten verschlüsselt werden müssen, liest sie das Benutzer-Passwort verwenden, und in der Regel sehr vorsichtig sein.

Andere Tipps

dbr sagte:

def hash_password(password):
    """Returns the hashed version of a string
    """
    return hasher.new( str(password) ).hexdigest()

Dies ist eine wirklich unsicher Weise Passwörter Hash. Sie nicht dies tun wollen. Wenn Sie wissen wollen, lesen Sie, warum die Bycrypt Papier von den Jungs, die das Passwort-Hashing-System für OpenBSD haben. Außerdem, wenn eine gute Diskussion wollen, wie Passwörter sind gebrochen Check-out

Wenn Sie einfach wollen, dann ein Wörterbuch verwenden, wo die Tasten sind die Benutzernamen und die Werte sind die Passwörter (verschlüsselt mit so etwas wie SHA256). Pickle es zu / von der Festplatte (wie dies eine Desktop-Anwendung ist, ich ginge davon aus dem Overhead im Speicher zu halten sein wird vernachlässigbar).

Zum Beispiel:

import pickle
import hashlib

# Load from disk
pwd_file = "mypasswords"
if os.path.exists(pwd_file):
    pwds = pickle.load(open(pwd_file, "rb"))
else:
    pwds = {}

# Save to disk
pickle.dump(pwds, open(pwd_file, "wb"))

# Add password
pwds[username] = hashlib.sha256(password).hexdigest()

# Check password
if pwds[username] = hashlib.sha256(password).hexdigest():
   print "Good"
else:
   print "No match"

Beachten Sie, dass dies die Passwörter als Hash - so sind sie im wesentlichen nicht wiederherstellbar. Wenn Sie Ihr Passwort vergessen haben, würden Sie einen neuen zugewiesen bekommen, nicht die alten zurück.

import hashlib
import random

def gen_salt():
    salt_seed = str(random.getrandbits(128))
    salt = hashlib.sha256(salt_seed).hexdigest()
    return salt

def hash_password(password, salt):
    h = hashlib.sha256()
    h.update(salt)
    h.update(password)
    return h.hexdigest()

#in datastore
password_stored_hash = "41e2282a9c18a6c051a0636d369ad2d4727f8c70f7ddeebd11e6f49d9e6ba13c"
salt_stored = "fcc64c0c2bc30156f79c9bdcabfadcd71030775823cb993f11a4e6b01f9632c3"

password_supplied = 'password'

password_supplied_hash = hash_password(password_supplied, salt_stored)
authenticated = (password_supplied_hash == password_stored_hash)
print authenticated #True

siehe auch gae-Authenticate-to-a-3rd-Party-Ort

Verwenden Sie "md5" es ist viel besser als base64

>>> import md5
>>> hh = md5.new()
>>> hh.update('anoop')
>>> hh.digest
<built-in method digest of _hashlib.HASH object at 0x01FE1E40>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top