Wie sicher ist sicher?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Hallo Leute,

ich hatte folgende Idee: Ich wollte mein Passwort wie in eine Zwiebelschale verpacken. In vielen Foren
wird nach wie vor das MD5-Verfahren als Standard verwendet. In Python gibt es diese schöne Bibliothek haslib.
Und diese Bibliothek unterstützt von MD5 bis SHA512. Nun habe ich mir für jedes Verfahren sozusagen
eine Funktion erstellt. Meine Grundidee war: Ein Hash-Wert kann ja nicht entschlüsselt werden, sondern
der Wert wird durch ein Vergleich-Verfahren "enttarnt". Und wenn ich aus dem Passwort zunächst einmal einen MD5-Wert
erzeugt habe, und aus diesem Wert dann einen SHA1-Wert zeugen lasse und so weiter - bis SHA512. Bei diesem
Vorgang ging ich davon aus, dass das Passwort mehr als sicher ist.

Und eine weitere Frage: Wäre bei meinem Vorgang noch etwas zu optimieren?

Code: Alles auswählen

import hashlib

def get_sha512(prompt):
    sha_512_object = hashlib.sha512(prompt.encode()).hexdigest()
    print "SHA512" , sha_512_object
    return sha_512_object
    
def get_sha384(prompt):
    sha_384_object = hashlib.sha384(prompt.encode()).hexdigest()
    sha_512_value = get_sha512(sha_384_object)
    print "SHA384" , sha_384_object
    return sha_512_value
    
def get_sha256(prompt):
    sha_256_object = hashlib.sha256(prompt.encode()).hexdigest()
    sha_384_value = get_sha384(sha_256_object)
    print "SHA256" , sha_256_object
    return sha_384_value
    
def get_sha224(prompt):
    sha_224_object = hashlib.sha224(prompt.encode()).hexdigest()
    sha_256_value = get_sha256(prompt)
    print "SHA224" , sha_224_object
    return sha_256_value

def get_sha1(prompt):
    sha_1_object = hashlib.sha1(prompt.encode()).hexdigest()
    sha_224_value = get_sha224(sha_1_object)
    print "SHA1" , sha_1_object
    return sha_224_value


def get_md5(prompt):
    md5_object = hashlib.md5(prompt.encode()).hexdigest()
    sha_1_value = get_sha1(md5_object)
    print "MD5" , md5_object
    return sha_1_value

def get_digest(prompt):
    get_coded_pwd = get_md5(prompt)
    return get_coded_pwd


your_pwd = raw_input('Please enter a password: ')
get_digest = get_digest(your_pwd)
print ""
print "Your coded password ", get_digest
Zuletzt geändert von Sophus am Mittwoch 11. November 2015, 16:11, insgesamt 1-mal geändert.
BlackJack

@Sophus: Ja das lässt sich optimieren. Statt zu vermuten dass das hintereinanderschalten von Hash-Funktionen sicherer ist könnte man sich mit dem Thema auseinandersetzen und dann wissen ob das sicherer ist oder Schlangenöl.

Oder man verwendet einfach *einen* Algorithmus der speziell für diese Aufgabe entworfen wurde. Also zum Beispiel bcrypt, scrypt, oder PBKDF2. Recht umfangreich ist das `passlib`-Package.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Hallo BlackJack, ich habe mir mal soeben die Bibliothek passlib installiert. Wenn ich also md5_crypt oder sha256_crypt etc. verwende, dann wird aus einem Passwort nur ein Wert entweder von MD5 oder SHA256 erzeugt. Leide habe ich im Netz gerade nichts gefunden, ob es was bringt, wenn ich aus einem Wert, zum Beispiel MD5, einen weiteren Wert erzeugt, zum Beispiel SHA1 und dann aus SHA1 nun SHA224 etc.
BlackJack

@Sophus: Nimm das als Hinweis das es nicht gemacht wird. Und das dann als Hinweis das es nicht sicherer wird, denn sonst würde es ja gemacht werden. Und wie gesagt: Nimm Algorithmen die speziell für das hashen von Passwörtern entwickelt wurden wenn Du Passwörter hashen willst.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Hallo BlackJack, um eine Hash-Wert auf einem Passwort zu machen, sollte ja doch die Standard-Bibliothek hashlib doch genügen oder? Oder ist diese Bibliothek nicht zu empfehlen? Dein Hinweis ist angekommen. Aber dennoch rein vom Verständnis bleibe ich noch irgendwie auf der Strecke. Inwiefern ist es nicht sicher? Ich meine, wenn ich einen SHA512-Wert habe, der wiederum aus einem anderen Wert entstammte, und so weiter, bis man irgendwann beim ursprünglichen Passwort angekommen ist. Zwischendurch entsteht ja ein langer und ewiger Weg, nicht? Mir geht es da eher ums reine Verständnis.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Sophus hat geschrieben:ich hatte folgende Idee: Ich wollte mein Passwort wie in eine Zwiebelschale verpacken.
Das klingt als ob du von Kryptographie keine Ahnung hast aber trotzdem versuchst Kryptographie zu betreiben. Das ist eine schlechte Idee. Das dies eine schlechte Idee ist sollte nicht nur offensichtlich sein, es wird grundsätzlich von jedem in diesem Kontext so häufig erwähnt und so deutlich betont dass man dies schon vollkommen bewusst ignorieren muss. Das macht die Idee nicht nur unglaublich schlecht sondern auch unglaublich dumm.
In vielen Foren wird nach wie vor das MD5-Verfahren als Standard verwendet.
Schlechte und unsichere Foren programmiert von schlechten Programmierern nutzen MD5. Das könnten tatsächlich viele sein, macht es aber nicht besser oder gar erstrebenswert.
Bei diesem Vorgang ging ich davon aus, dass das Passwort mehr als sicher ist.
Ist es nicht. Ganz und gar nicht. Wenn es tatsächlich so einfach wäre sichere Hashes zu erzeugen wären Leute mit mehr Ahnung als du auf die Idee auch schon vorher gekommen.
Und eine weitere Frage: Wäre bei meinem Vorgang noch etwas zu optimieren?
Nein. Von Idee bis hin zum konkreten Vorgang ist dass ganze so schlecht dass es hier nichts zu retten geschweige denn optimieren gibt.

Für Passwörter gibt es eine Reihe von empfehlenswerten und sicheren Algorithmen, die man verwenden kann: pbkdf2, bcrypt, scrypt und seit neustem argon2. argon2 ist noch recht neu deswegen sollte man damit vielleicht noch etwas warten. scrypt hat den Vorteil gegenüber pbkdf2 und bcrypt dass es nicht nur rechenintensiv ist sondern auch einiges an Speicher kostet und pbkdf2 und bcrypt nehmen sich nicht wirklich was.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Dir geht es doch aber nicht um einen Hashwert, sondern darum einen nicht durch bruteforce ueberwindbaren Hashwert zu bilden.

Das Problem mit general purpose Hashfunktionen wie MD5(geknackt, auf keinen Fall benutzen), SHA1(unter schwerem Beschuss, nicht benutzen) und vielen anderen, ist das sie auf dem genau gegenteilig entworfen sind: Grosse Mengen in kurzer Zeit und ressourcen schonend zu hashen.

Darum gibt es sogenannte Key Derivaten Functions, die genau dem entgegen wirken und sowohl die Zeitkomplexitaet als auch die Speicherkomplexitaet enorm erhoehen. BlackJack hat sie ja genannt.

Und weil man es nicht oft genug sagen kann: Wenn du keine Ahnung von Kryptographie hast, dann versuche erst gar nicht ein System aus kryptographischen Primitiven selbt zu erstellen, sondern benutze fertige.
Selbst wenn die Primitive sicher sind, kann man durch falsches Zusammenschalten zu einem unsicheren System kommen.
Antworten