Alte Python Hashing von links nach rechts – warum ist es schlecht?

Ich versuche zu lernen, wie man gegen Sicherheitsangriffe auf Websites verteidigt. Der Link unten zeigt ein gutes Tutorial, aber ich bin von einer Aussage verwirrt:

In http://google-gruyere.appspot.com/part3#3__client_state_manipulation , unter "Cookie Manipulation", Gruyere sagt Pythons Hash ist unsicher, da es Hashes von links nach rechts.

Die Gruyere-Anwendung verwendet diese zur Verschlüsselung von Daten:

# global cookie_secret; only use positive hash values h_data = str(hash(cookie_secret + c_data) & 0x7FFFFFF) 

C_data ist ein Benutzername; Cookie_secret ist eine statische Zeichenfolge (die gerade standardmäßig ist)

Ich verstehe das bei sichereren Hash-Funktionen, eine Veränderung erzeugt ein ganz neues Ergebnis, aber ich verstehe nicht, warum dies unsicher ist, denn verschiedene c_data erzeugt ganz andere Hashes!

EDIT: Wie würde man so einen Hash machen?

5 Solutions collect form web for “Alte Python Hashing von links nach rechts – warum ist es schlecht?”

Was der Kommentar vielleicht zu bekommen versucht ist, dass für die meisten Hash-Funktionen, wenn Sie HASH(m) dann ist es einfach, HASH(m . x) zu berechnen, für jede x (wo ist die Verkettung).

Wenn du also Benutzer ro bist und der Server dir HASH(secret . ro) schickt, dann kannst du HASH(secret . root) leicht berechnen und als anderer Benutzer anmelden.

Ich denke, das ist nur eine schlechte Erklärung dort. Pythons hash() ist unsicher, weil es einfach ist, Kollisionen zu finden, aber "Hashes von links nach rechts" hat nichts damit zu tun, warum es einfach ist, Kollisionen zu finden. Kryptographisch sichere Hashes verarbeiten auch Daten streng nacheinander; Sie sind wahrscheinlich auf Daten 128 oder 256 Bits zu einem Zeitpunkt statt ein Byte zu einem Zeitpunkt zu betreiben, aber das ist nur ein Detail der Umsetzung.

(Es sollte gesagt werden, dass hash() unsicher ist, ist kein Fehler in Python, denn das ist nicht das, was es ist. Es ist ein exponiertes Detail der Implementierung von Pythons Wörterbüchern als Hash-Tabellen , und du willst generell keine sichere Hash-Funktion Für deine Hash-Tabelle, denn das würde es so weit verlangsamen, dass es den Zweck besiegen würde. Python bietet sichere Hash-Funktionen im hashlib- Modul.)

(Die Verwendung eines unsicheren Hash ist nicht das einzige Problem mit dem Code, den Sie zeigen, aber es ist bei weitem das wichtigste Problem.)

Pythons Standard-Hash-Algorithmus (für alle Typen, aber es hat die meisten schwerwiegenden Konsequenzen für Saiten, wie sie häufig für die Sicherheit gehasht werden) ist darauf ausgerichtet, schnell zu laufen und nett zu spielen mit der Umsetzung von Dicts. Es ist keine kryptografische Hash-Funktion, du solltest es nicht für die Sicherheit verwenden. Verwenden Sie hashlib dafür.

Die Python-Einbau- Hash-Funktion ist nicht für sicheres, kryptographisches Hashing gedacht. Es ist beabsichtigt, die Speicherung von Python-Objekten in Wörterbüchern effizient zu erleichtern.

Die internen Hash-Implementierungen sind zu vorhersehbar (zu viele Kollisionen) für sichere Verwendungen. Zum Beispiel sind die folgenden Aussagen alle wahr:

 hash('a') < hash('b') hash('b') < hash('c') hash('c') < hash('d') 

Diese sequentielle Natur macht ein großes Wörterbuch-Speicher-Verhalten, für das es entworfen wurde.

Um einen sicheren Hash zu erstellen, verwenden Sie stattdessen die hashlib- Bibliothek.

Man würde über einen solchen Hash "schlagen", indem er ihre Daten an das Ende des Strings anhängt und die Hash-Funktion ausgegeben hat. Lassen Sie mich das verdeutlichen:

 Python 2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)] on win32 Type "copyright", "credits" or "license()" for more information. >>> data = 'root|admin|author' >>> str(hash('' + data) & 0x7FFFFFF); '116042699' >>> data = 'root|admin|authos' >>> str(hash('' + data) & 0x7FFFFFF); '116042698' >>> 

Leere Zeichenfolge ('') ist das Cookie-Geheimnis, das Sie erwähnt haben, um eine leere Zeichenfolge zu sein. In diesem besonderen Beispiel, wenn auch nicht wirklich ausnutzbar, kann man sehen, dass sich der Hash um 1 verändert hat und das letzte Byte der data "um eins" verändert hat. Nun, dieses Beispiel ist nicht wirklich ein Exploit (weglassen die Tatsache, dass die Schaffung eines Benutzernamens der anything_here|admin Format macht diese Benutzer admin), weil es einige Daten nach dem Benutzernamen (von links nach rechts) so auch wenn Sie einen Benutzernamen, der sehr nah ist Zu dem, der angegriffen wird, dann ändert der Rest des Strings den Hash in einer völlig unerwünschten Weise. Allerdings, wenn der Cookie in Form von 105770185|user07 anstelle von 105770185|user07||author dann würden Sie ganz einfach einen Benutzer "user08" oder "user06" erstellen und berechnen den Hash (Hometask: was ist der Hash für "user08 "?").

  • Python crypt in OSX
  • Verschlüsseln von Passwörtern auf POST Django
  • Verschlüsselte Datei oder db in python
  • Wie kann ich meinen Code in python drucken
  • Entschlüsseln von Daten in Python, die in Java von Java verschlüsselt wurden
  • Xor Verschlüsselung / Entschlüsselung einer Datei mit Python 3
  • Verwenden von DPAPI mit Python?
  • Python Blowfish Verschlüsselung
  • Python Caesar Cipher Decoder
  • Passwortschutz Python
  • Python PyCrypto verschlüsselt / entschlüsselt Textdateien mit AES
  • Python ist die beste Programmiersprache der Welt.