Gestern habe ich mich in bisschen in sqlite3 eingearbeitet.
Ich habe eine kleine Datenbank für Logins angelegt.
Hier mal einen Ausschnitt aus dem Code, wie ich die Hashes generiere:
Code: Alles auswählen
import hashlib
import os
def gen_salt():
"""
Generates a salt with 10 bytes
"""
return os.urandom(10)
def hash_pw(password, salt):
"""
Hashes each password with a given salt.
:param password: str
:param salt: bytes
:return: hashed password as bytes
"""
return hashlib.pbkdf2_hmac('sha512', password.encode(), salt, 10)
def check_pw(password, hash, salt):
"""
Checks the password with given hash and salt.
:param password: str
:param hash: bytes
:param salt: bytes
:return: bool
"""
pw_hash = hash_pw(password, salt)
return pw_hash == hash
Ich speichere einfach für jeden User einen individuellen Hash. Keine Ahnung ob das überhaupt notwendig ist, aber ich mache das so.
Wenn du dann z.B. einen User anlegen willst:
Code: Alles auswählen
from collections import namedtuple
Row = namedtuple('User', 'username password salt')
username = 'Foo'
password = 'Bar'
salt = gen_salt()
hashed_password = hash_pw(password, salt)
user = Row(username, hashed_password, salt)
print(user)
Code: Alles auswählen
User(username='Foo', password=b"TX\x99\xd5UH\xbd\x0e/\xc4\x114\xd3pN\xed\x9f\xf9yp\xdb\x18\xf4\x95_\x13*'C*\x0f\x1d\x93\xf5\x08b8\x06\xa0.\xff\x04\xe8=B.\x18\x16:\x93\xdf\xbb\x94'\x01\x90\x19O\xb0\xf4\xb5\xd2\xeeV", salt=b'U\x00?\xce\x02$\xb2B\xfa\x03')
Nun das eingegebene Passwort überprüfen:
Code: Alles auswählen
wrong_password = 'Foo'
right_password = 'Bar'
if check_pw(wrong_password ,user.password, user.salt):
print(wrong_password, 'is ok.')
else:
print(wrong_password, 'is wrong.')
if check_pw('Bar' ,user.password, user.salt):
print(right_password, 'is ok')
else:
print(right_password, 'is wrong.')
Falls noch grobe Fehler drin sind, bitte sagen. Ich bin auch noch dabei zu lernen was Sicher ist und was man besser gar nicht tun sollte.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server