Python Authentication API
-
09-06-2019 - |
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.
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
Ich glaube, Sie sollten Ihre eigene Authentifizierungsmethode, wie Sie können es Ihre Anwendung passen am besten, aber eine Bibliothek für die Verschlüsselung verwenden, wie hier bekommen
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>