import base64 import random import hashlib def eintrag(benutzer,passwort): """ gibt einen String der Art benutzer;hash;salt zurück, dabei wird der String benutzer utf8 codiert, der hash ist sha1, salt sind 4 zufällige Bytes, alle drei Werte werden base64 codiert Trennzeichen ist ';' """ eb = bytearray(benutzer,'utf8') s0 = base64.b64encode(eb) S = bytearray([random.randint(0,255),random.randint(0,255),random.randint(0,255),random.randint(0,255)]) epasswort = bytearray(passwort,'utf8') h = hashlib.sha1(epasswort + S) s1 = base64.b64encode(h.digest()) s2 = base64.b64encode(S) return str(s0,'ASCII')+';'+str(s1,'ASCII')+';'+str(s2,'ASCII') def eintrag_ok(benutzer,passwort,eintrag): """ gibt True zurück, wenn benutzer und passwort mit eintrag übereinstimmen, sonst False """ try: s = eintrag.split(';') eb = bytearray(benutzer,'utf8') s0 = str(base64.b64encode(eb),'utf8') if s[0] != s0: return False else: h = hashlib.sha1(bytearray(passwort,'utf8') + base64.b64decode(bytes(s[2],'utf8'))) s1 = str(base64.b64encode(h.digest()),'utf8') if s[1] == s1: return True else: return False except: return False def eintragen(benutzer,passwort): """ trägt eine Zeile der Art benutzer;hash;salt in die Datei 'passwort.txt' ein, dabei wird der String 'benutzer' utf8 codiert, der hash ist sha1, salt sind 4 zufällige Bytes, alle drei Werte werden base64 codiert """ datei = open('passwort.txt','a') datei.write(eintrag(benutzer,passwort)+'\n') datei.close() def in_Datei(benutzer,passwort,dateiname): """ überprüft ob die Datei 'dateiname' für 'benutzer,passwort' einen gültigen Eintrag hat """ datei = open(dateiname,'r') z = datei.read().split('\n') datei.close() # print(z) # DEBUG """ if z[-1] == '': z = z[:-1] """ n = len(z) ok = False; i = 0 while (not ok) and (i < n): if eintrag_ok(benutzer,passwort,z[i]): ok = True else: i = i + 1 return ok def in_Datei_f(benutzer,passwort,dateiname): """ überprüft, ob die Datei 'dateiname' für 'benutzer,passwort' einen gültigen Eintrag hat """ datei = open(dateiname,'r') z = datei.read().split('\n') datei.close() return len([x for x in z if eintrag_ok(benutzer,passwort,x)]) > 0