Passwörter als 224bit Hash-Werte!

Code-Stücke können hier veröffentlicht werden.
Antworten
search
User
Beiträge: 67
Registriert: Donnerstag 24. April 2008, 10:03
Wohnort: In Deutschland

Dienstag 24. März 2009, 16:38

Hallo zusammen,
habe die letzten Tage wieder ein bischen mit Python probiert und dabei ist das herausgekommen. Eine Passwortabfrage über den Hash-Wert! Es werden keine Passwörter der einzelnen User gespeichert sondern nur der Hash-Wert (in diesem Fall 224bit).
Ist der Aufbau so OK oder kann/sollte ich das noch etwas umschreiben.
Bin für alle Tipps zu haben:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*- entspricht unicode
#Python v.2.5.2
#Standard Python-Kopf für Deutsche Umlaute!!!
import hashlib
from time import strftime

#Beispiel-Datenbank von Usern
#User-Stefan / passwort=Test1234 // User-Thomas / Passwort=NeuerName
#Hash-Typ: Secure Hash Algorithm 224 -Erzeugt aus einem beliebigen String einen 224-Bit-Hash-Wert.
#Das Passwort wird nicht gespeichert sondern nur der erzeugte Hash-Wert zum vergleich
daten_user={'Stefan':'9e944c9fc213754b493939c9445a9578e9b90e2f8adef6b9015e8539',  'Thomas':'0befa918a3babe85df987c5be80af0d19f40c68e637d37868cf42ede'}

#Eingabeaufforderung des Benutzernamens mit Uhrzeit und Datum
#Drei Versuche, dann Abbruch
x=0                                 #Startwert Zähler für Schleife
while x < 3:
    info=strftime("Aktuelle-Zeit: %X %x")   #Ausgabe von Datum und Uhrzeit
    print info
    name_user=raw_input('Ihr Name: ')   #Eingabe des User-Name
    u_name=daten_user.get(name_user)
    if u_name == None:
        print 'Name nicht angelegt!'        #Schleife wenn User-Name falsch
        x +=1                                               #Zähler für Schleife um eins pro durchlauf erhöhen
    else:
        passwort = hashlib.sha224(raw_input('Passwort: '))          #Passwortabfrage und umwandeln in
        if u_name != passwort.hexdigest():                                                   #224-Bit Hash-Wert
            print 'Falsches Passwort!'          #Hier Abbruch wenn Passwort falsch
            break
        else:
            print 'Bitte kommen Sie herein!'                            #Hier alles OK!
            break
   
print 'Willkommen Zuhause %s!!!!' %(name_user)   
Wer es selber Testen will, in Zeile 9 stehen die Passwörter der beiden Muster-User.
Gruß
Stefan
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Dienstag 24. März 2009, 16:57

1. Du hast jede menge überflüssige und noch schlimmer deplazierte Kommentare.

2. Erklär den Code nicht mit Kommentaren, sondern schreibe ihn selbsterklärend und kommentiere das 'Warum?' nicht das 'Wie?'

3. Glieder den Code in Funktionen.

Und last but not least: Beachte PEP 8.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 24. März 2009, 17:53

Oh und Hashes ohne Salt? Das ist hier nicht so notwendig, aber man sollte dennoch im Kopf behalten dass Salts nützlich sind.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
search
User
Beiträge: 67
Registriert: Donnerstag 24. April 2008, 10:03
Wohnort: In Deutschland

Dienstag 24. März 2009, 18:02

Salt??? :shock: Was ist das... muss mal schnell googeln!!!
lunar

Dienstag 24. März 2009, 18:08

Mal abgesehen davon, dass es dafür Standards wie PBKDF gibt, für die man im Netz auch Python-Implementierungen findet.
search
User
Beiträge: 67
Registriert: Donnerstag 24. April 2008, 10:03
Wohnort: In Deutschland

Dienstag 24. März 2009, 18:10

Haaa, ich habe was gefunden:
Also der Salt (beliebige Zeichenkette) werden an das Passwort gehängt und daraus wird dann der Hash-Wert gebildet, ist das richtig??
lunar

Dienstag 24. März 2009, 18:17

search hat geschrieben:Haaa, ich habe was gefunden:
Also der Salt (beliebige Zeichenkette) werden an das Passwort gehängt und daraus wird dann der Hash-Wert gebildet, ist das richtig??
Ja.
search
User
Beiträge: 67
Registriert: Donnerstag 24. April 2008, 10:03
Wohnort: In Deutschland

Dienstag 24. März 2009, 18:46

Danke erst mal für die Tipps und Infos!! Werde morgen mein kleines Programm noch mal überarbeiten und verbessern (PEP 8).
Gruß
Stefan

P.S.:
Lunar schrieb: Mal abgesehen davon, dass es dafür Standards wie PBKDF gibt, für die man im Netz auch Python-Implementierungen findet.
Das kann schon sein, ich wollte das aber selbst mal Programmieren!! Wie soll man denn sonst eine gewisse Routine/Erfahrung/Wissen für Python entwickeln??????????????
lunar

Dienstag 24. März 2009, 19:07

Ein Fragezeichen reicht. Wenn du daran etwas lernst, ist das gut, aber in "Produktivcode" ist es eigentlich immer besser, bereits existierenden Code wiederzuverwenden :)

Btw, noch etwas: Zur Passworteingabe gibt es das "getpass"-Modul, im Gegensatz zu raw_input wird dabei das Passwort nicht angezeigt. Außerdem würde ich persönlich nicht ".hexdigest()" nutzen, sondern lieber ".digest()" base64-encodieren, dann kommt keine derart lange Zeichenkette raus.
search
User
Beiträge: 67
Registriert: Donnerstag 24. April 2008, 10:03
Wohnort: In Deutschland

Dienstag 24. März 2009, 19:15

Danke lunar,
ich glaube du kannst Gedanken lesen oder? Das waren genau meine nächsten Fragen gewesen (versteckte Passworteingabe und hexdigest() oder digest()).
Vielen Dank für die Infos!
Gruß
Stefan
search
User
Beiträge: 67
Registriert: Donnerstag 24. April 2008, 10:03
Wohnort: In Deutschland

Mittwoch 25. März 2009, 13:55

Hallo zusammen,
ich habe jetzt mein kleines Monster :shock: ein bischen verändert. Hoffe das jetzt alles ein bischen besser zu Lesen und zu verstehen. Die User-Daten habe ich ausgelagert in eine separate Datei (denke, wenn so eine Abfrage benutzt würde, wäre ja die User-Datenbank auch wesentlich größer und somit macht es schon Sinn sie in eine Datei zu verschieben, oder?)!
Dann habe ich (hoffentlich) auch das PEP 8 so ziemlich eingehalten :lol: sowie die von lunar empfohlene 64bit-encodierung und auch das Salt von Leonidas!!
Seht es euch einfach mal an:

Code: Alles auswählen

import NameUser
import hashlib
import base64
import getpass
from time import strftime

def make_hash(user,  hash_user_name):
    passwort = getpass.getpass('Passwort: ')
    komplett_p = user+passwort
    hash_1v = hashlib.sha224(komplett_p).digest()
    hash_komplett = base64.encodestring(hash_1v)
    if hash_user_name != hash_komplett:                                                   
        print 'Falsches Passwort!'
    else:
        print 'Willkommen Zuhause %s!!!!' %(user) 

for i in range(4):
    info_zeile = strftime("Aktuelle-Zeit: %X %x")   
    print info_zeile
    name_user = raw_input('Ihr Name: ')   
    h_user_name = NameUser.daten_user.get(name_user)
    if h_user_name == None:
        print 'Name nicht angelegt!'        
    else:
        make_hash(name_user,  h_user_name)
        break
P.S.: habe noch schnell die while Schleife rausgeworfen und eine mit for und range
gemacht, sieht besser aus.

Gruß
Stefan
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Mittwoch 25. März 2009, 14:16

Ich hab damit noch 3 Probleme:
1. Dieses denglisch ist ja fürchterlich. Entweder du entscheidest dich komplett für deutsche Namen oder nur für englische .. das sollte man nicht mischen.

2. Was ist NameUser? (das hält sich im übrigen auch nicht an PEP8 ;) )

3. Benutze keine Magic Numbers und bennene deine Variablen erklärend. Dh.: `x' -> `tries'; `3' -> `MAX_TRIES = 3'

€: Die For-Schleife nutzt dir nicht viel .. Ehrlich gesagt finde ich die noch nichtssagender als die `x&3'-while-Schleife
search
User
Beiträge: 67
Registriert: Donnerstag 24. April 2008, 10:03
Wohnort: In Deutschland

Mittwoch 25. März 2009, 14:26

Hallo cofi,
Sorry, habe vergessen zu erwähnen das in der Import Datei >NameUser die Daten der angemeldeten User sind!
Die for Schleife (vorher while) habe ich nur drinn, damit der User beim Anmelden drei Möglichkeiten hat, wenn er sich mal verschreibt. Aber nur beim User-Namen. Wenn das Passwort falsch ist, ist gleich ende. OK, kein denglisch mehr... :)
lunar

Mittwoch 25. März 2009, 16:50

Echtes salting sehe ich da auch nicht. Ein Salt ist ein zufälliger Wert, der dem erzeugten Hash vorangestellt wird, und bei der Überprüfung abgetrennt und wiederverwendet wird ... der Benutzername jedenfalls zählt nicht als Hash.

Im Übrigen verwendet man meist auch noch mehrere Hashing-Iterationen.
search
User
Beiträge: 67
Registriert: Donnerstag 24. April 2008, 10:03
Wohnort: In Deutschland

Mittwoch 25. März 2009, 18:13

Hallo lunar,
da hast du völlig recht! Werde für den Salt auch ncoh einen zufälligen Wert einfügen, ist in Arbeit... 8)
Und wie gesagt, war nur eine Übung für mich!
Danke und Gruß
Stefan
Antworten