Frage zur hashlib

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
NorbertW
User
Beiträge: 4
Registriert: Mittwoch 31. August 2011, 18:37

Hallo ich hätte eine Frage,

und zwar mit:

Code: Alles auswählen

import hashlib

string = 'Der Hund geht um die Ecke'
hashA = hashlib.sha512(string).hexdigest()
print hashA
Bekomme ich einen netten hash:

Code: Alles auswählen

c75549a1d7683fd902a4afdaa7f40c1c8a77c5adc54baeb850ffe32a023db44ebd9e9a7283f287ab8bd55cd104c79bc14e30aabb00af96ac57c4a264b35fbfe3
Aber wie wandel ich "diesen" Hash wieder in Klartext um? :K
senft
User
Beiträge: 25
Registriert: Montag 31. März 2008, 14:47

Hashes sind nicht darauf ausgelegt wieder in Klartext "umgewandelt" zu werden. Das geht i.d.R. nur über Tabellen, die Hashwerte auf entsprechende Klartexte abbilden, was natürlich mit immensem Speicheraufwand verbunden ist.

http://de.wikipedia.org/wiki/Hashfunktion
http://de.wikipedia.org/wiki/Secure_Hash_Algorithm
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

senft hat geschrieben:Das geht i.d.R. nur über Tabellen, die Hashwerte auf entsprechende Klartexte abbilden, was natürlich mit immensem Speicheraufwand verbunden ist.
Und natuerlich der Rechenaufwand ;) Stichwort ist dazu "Rainbow Table".
NorbertW
User
Beiträge: 4
Registriert: Mittwoch 31. August 2011, 18:37

cofi hat geschrieben:
senft hat geschrieben:Das geht i.d.R. nur über Tabellen, die Hashwerte auf entsprechende Klartexte abbilden, was natürlich mit immensem Speicheraufwand verbunden ist.
Und natuerlich der Rechenaufwand ;) Stichwort ist dazu "Rainbow Table".
Warum sollte es?

Ich meine ich bekomme jedesmal den selben Wert für diesen Satz, also müsste es doch ohne probs möglich sein das zurück zu rechnen?

Eigentlich ist es "nur Spielerrei" aber ich hatte vor ein kleines Tool zu basteln das:

1. aus einem Passwort einen Hash bildet
2. aus einem Text einen Hash bildet
3. den Hash des des Passwords und des Textes addiert
4. Ergebnis weitergeben

Rückwerts sollte es dann doch gehen:
1. aus einem eingegebenem Password einen Hash bilden
2. vom gesammt Hash subtrahieren
3. verbleibenden Hash zurück in Klartext übersetzten. (wobei nur Sinn raus kommt wenn beide Passwörter gleich sind)

:K :mrgreen:
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Lese doch einfach mal den entsprechenden Wikipediaeintrag zu Hashfunktionen ;-)

Sebastian
Das Leben ist wie ein Tennisball.
lunar

@NorbertW: Eine Funktion und ihre Umkehrfunktion sind eben nicht dasselbe. Nur weil eine Funktion selbst bekannt und einfach berechenbar ist, muss das nicht auch gleich automatisch für die Umkehrfunktion gelten. Und es lassen sich eben Klassen von Funktionen finden, für die das nicht so einfach möglich ist.

Das kannst Du schon im Kleinen beobachten: Die analytische Berechnung der Quadratfunktion oder der Kubikfunktion ist einfach, aber die Quadratwurzel oder gar die Kubikwurzel zu ziehen, ungleich schwerer. Hashfunktionen sind nur das Extrem dieses Phänomens.
BlackJack

@NorbertW: Um noch eine ganz einfache Funktion als Analogie hinzuzuziehen:

Code: Alles auswählen

In [6]: abs(1)
Out[6]: 1

In [7]: abs(-1)
Out[7]: 1

In [8]: abs(x)
Out[8]: 1
Hier kann man jetzt auch nicht ohne zu raten, sagen welchen Wert `x` hat. Im Gegensatz zur `abs()`-Funktion, wo es nur zwei Möglichkeiten gibt was `x` gewesen sein könnte, gibt es für Deinen Hashwert *unendlich* viele Möglichkeiten für den Eingabewert der zu diesem Hash führt.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Kleine Ergaenzung zu BlackJack: Das intuitive Argument fuer "unendlich viele" Moeglichkeiten ist, dass beliebige Textlaengen auf 128 Bit, 256 Bit, o.ae. Laengen verkuerzt/verlaengert werden und nach dem Pigeon-Hole Prinzip muss es dann Werte geben, die auf denselben Wert abgebildet werden.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Als andere Analogie schlage ich mal die Quersumme vor.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
NorbertW
User
Beiträge: 4
Registriert: Mittwoch 31. August 2011, 18:37

Okay, jetzt hab ich es dank Antworten und Links endlich verstanden :D

Und hab mal gebastelt :D

Code: Alles auswählen

def crypt(password, content, decrypt=False):
    rand = random.Random(hashlib.sha512(password).hexdigest()).randrange
    if (decrypt):
        content= base64.b64decode(content)
    content = ''.join([chr(ord(elem)^rand(256)) for elem in content])
    if not (decrypt):
        content = base64.b64encode(content)
    return content


password="Testpassword"
text = "Ich bin ein etwas längerer Testtext"

crypt_text = crypt(password, text)
print "Verschlüsselt: %s" % (crypt_text)
print "Entschlüsselt: %s" % (crypt(password, crypt_text ,True))
Wobei der Hashwert vom Passwort hier wohl irgendwie nicht sein müsste...

Also Danke erstmal an alle, ich probiere und lese weiter :D

EDIT: Sorry für die zwei Tippfehler die eben drinn waren!
Zuletzt geändert von NorbertW am Mittwoch 31. August 2011, 23:58, insgesamt 1-mal geändert.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Du solltest hier schon lauffähigen Code posten.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
NorbertW
User
Beiträge: 4
Registriert: Mittwoch 31. August 2011, 18:37

jbs hat geschrieben:Du solltest hier schon lauffähigen Code posten.
Habs gemerkt, sorry nochmal und ist ausgebessert. Ist schon zu spät ich geh dann mal ins Bett, so langsam muss ich mich daran gewöhnen das bald die Ferien rum sind, leider!
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Ich würde zwei getrennte Funktionen schreiben. Eine zum ver- die andere zum entschlüsseln.

Gefühlt würde ich auch eher zuerst den Parameter `content` dann `password` nehmen.

`if` braucht keine Klammern.

Die LC kannst du als GE ohne eckige Klammern schreiben.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ich würde hier auch nicht unbedingt das random-Modul verwenden. Zum einen kann der entsprechende Algorithmus durchaus schnell mal ausgetauscht werden, zum andern sollte der Hashwert an sich schon gestreut genug sein.
Das Leben ist wie ein Tennisball.
BlackJack

@EyDu: Der Hashwert ist aber recht kurz im Vergleich zu einem "endlosen" Strom von "Zufallszahlen". Vergleich mal die Periode von beiden.
lunar

@BlackJack: Der Unterschied ist aus kryptographischer Sicht wohl eher egal, als OTP-Schlüssel taugt beides nicht.
BlackJack

@lunar: So egal ist das nicht. Wenn Du etwas Längeres verschlüsselst als der Hash, dann müsstest Du den ja wiederholen, und 32 sich wiederholende Bytes sind sicher einfacher zu analysieren als ein Pseudozufallszahlengenerator mit einer Periode von 2**19937-1. Ich finde gerade das Paper nicht wieder, aber ich bin mir ziemlich sicher gelesen zu haben, dass man ≈600 generierte Zahlen braucht um beim Mersennetwister sagen zu können in welchem internen Zustand der sich gerade befindet. Und da sind die 32-Bit-Zahlen gemeint. Wenn die von `randrange()` noch mal auf 8-Bit runter gestutzt werden, gehen ja Informationen davon verloren.
Antworten