Frage:
Ist die Passwortsicherheit meines Entwicklers selbst richtig oder falsch und warum?
nallenscott
2012-12-18 20:51:12 UTC
view on stackexchange narkive permalink

Ein Entwickler, nennen wir ihn 'Dave', besteht darauf, selbstgebraute Skripte für die Passwortsicherheit zu verwenden. Siehe Daves Vorschlag unten.

Sein Team hat monatelang ein Industriestandardprotokoll mit Bcrypt übernommen. Die Software und Methoden in diesem Protokoll sind nicht neu und basieren auf bewährten Implementierungen, die Millionen von Benutzern unterstützen. Dieses Protokoll besteht aus einer Reihe von Spezifikationen, die den aktuellen Stand der Technik, die verwendeten Softwarekomponenten und deren Implementierung beschreiben. Die Implementierung basiert auf einer bekanntermaßen guten Implementierung.

Dave sprach sich vom ersten Tag an gegen dieses Protokoll aus. Seine Argumentation war, dass Algorithmen wie Bcrypt, weil sie veröffentlicht werden, für Hacker besser sichtbar sind und eher angegriffen werden. Er argumentierte auch, dass das Protokoll selbst zu umfangreich und schwer zu pflegen sei, aber ich glaube, Daves Hauptproblem war die Tatsache, dass Bcrypt veröffentlicht wird.

Was ich zu erreichen hoffe Indem Sie seinen Code hier teilen, erzielen Sie einen Konsens über:

  1. Warum Hausbrauen keine gute Idee ist und
  2. Was speziell an seinem Skript falsch ist
  3. ol>
      / ** Dave's Home-Brew Hash * /// Benutzerdaten $ user = ''; $ password = ''; // Zeitstempel, zufällig # $ time = date ('mdYHis '); $ rand = mt_rand ().' \ n '; // crypt $ crypt = crypt ($ user. $ time. $ rand); // Hashfunktion hash_it ($ string1, $ string2) {$ pass = md5 ( $ string1); $ nt = substr ($ pass, 0,8); $ th = substr ($ pass, 8,8); $ ur = substr ($ pass, 16,8); $ ps = substr ($ pass, 24,8); $ hash = 'H'.sha1 ($ string2. $ ps. $ ur. $ nt. $ th); return $ hash} $ hash = hash_it ($ password, $ crypt);  
... und jetzt ist Daves Protokoll veröffentlicht?
Bedeutet der Aufruf von "Datum" nicht, dass dasselbe Passwort zu unterschiedlichen Zeiten zwei verschiedene Hashes hat?
@jdm Ich würde vermuten, dass er "$ time" und "$ rand" als Salz in der Datenbank speichert. Wenn nicht, ist dies eindeutig gebrochen.
Dave hätte vielleicht Recht gehabt, wenn er einen besseren und sichereren Ansatz gefunden hätte. Er hat nicht. Der Grund, warum wir veröffentlichte Algorithmen verwenden, ist, dass wir alle von der kollektiven Weisheit anderer profitieren und uns nicht auf unser persönliches und sich weiterentwickelndes Verständnis eines Konzepts verlassen müssen.
@schroeder vereinbart. Meine erste Reaktion war, den aktuellen Stand der Technik zu konsultieren und darauf aufzubauen. Ich würde gerne diese Art von IP besitzen, aber die Realität ist, dass wir nicht über die Fähigkeiten, Techniken, Geräte und Arbeitskräfte verfügen, um 1) den Algorithmus zu erstellen, 2) den Algorithmus zu testen und 3) den Algorithmus beizubehalten ...
Dave hat eine grundsätzlich falsche Prämisse, dass die Sicherheit eines Algorithmus (sogar teilweise) von seiner Dunkelheit abhängt - das ist nicht der Fall. Die Sicherheit eines Hashing-Algorithmus beruht auf den Grenzen unseres Verständnisses der Mathematik und in geringerem Maße auf der Fähigkeit der Hardware, sie brutal zu erzwingen. Sobald Dave diese Realität akzeptiert (und es ist wirklich Realität, lesen Sie den Wikipedia-Artikel über Hashing), ist es eine Frage, wer schlauer ist - Dave allein oder eine große Gruppe von Spezialisten, die sich diesem speziellen Problem widmen.
@ChrisB.Behrens Andernfalls bekannt als [Kerckhoff-Prinzip] (http://en.wikipedia.org/wiki/Kerckhoffs%27s_principle).
Bitte sag Dave, dass er das Rad nicht neu erfinden soll.
Am schlimmsten ist jedoch, dass sein Algorithmus in wenigen Minuten brutal erzwungen werden kann, wahrscheinlich für Ihre gesamte Nutzerbasis. **
Zusätzlich zu dem, was bereits gesagt wurde, möchte ich darauf hinweisen, dass * veröffentlichte Algorithmen so konzipiert sind, dass sie sicher bleiben, obwohl sie veröffentlicht wurden *. Das heißt, sie müssen * besser * sein als Algorithmen, die sich darauf verlassen können, dass der Gegner nicht weiß, wie sie funktionieren.
Das Problem ist nicht, dass Dave dumm ist; er ist wahrscheinlich nicht. Das Problem ist, dass sein Algorithmus nicht jahrelang brutalen Feldtests durch Armeen von Experten unterzogen wurde. Dies ist der ** einzige ** Weg, um zu zeigen, dass ein Hashing-Algorithmus sicher ist.
Das Problem ist nicht, dass Dave dumm ist. In gewisser Weise sind wir alle dumm. Es ist so, dass er dem [Dunning-Kruger-Effekt] (http://en.wikipedia.org/wiki/Dunning–Kruger_effect) zum Opfer gefallen ist und nicht nur keine Ahnung hat, wie dumm er ist, sondern * völlig überzeugt * ist, dass er es weiß besser als die Experten auf dem Gebiet. Das ist die wahre Gefahr. Dumm und bewusst ist es in Ordnung, und wie wir alle danach streben sollten. Dumm und ahnungslos ist schlecht, aber vergleichsweise leicht zu beheben. Dumm und peinlich übermütig ist sowohl extrem gefährlich als auch häufig unmöglich zu reparieren.
"Ich habe bereits ein ziemlich standardmäßiges Protokoll recherchiert und erstellt, das auf Bcrypt basiert. Mein Protokoll ist nicht neu, sondern basiert auf bewährten Implementierungen, die Millionen von Benutzern unterstützen." Du liegst hier fast so falsch wie Dave. Der Teufel steckt im Detail der Implementierung. Es ist gut, keinen eigenen Algorithmus / kein eigenes Protokoll zu schreiben, aber Sie sollten es auch nicht implementieren. Wenn Sie kein Experte sind, sollten Sie nicht darauf vertrauen, dass das Passwort-Hashing für jeden Code erfolgt, den Sie selbst geschrieben haben. Die einzig verantwortliche Sache ist die Verwendung einer bekanntermaßen guten Implementierung, nicht nur eines bekanntermaßen guten Protokolls.
Bitte beachten Sie diese http://security.stackexchange.com/questions/6095/xkcd-936-short-complex-password-or-long-dictionary-passphrase, wenn Sie ein Passwort wählen.
Bitte sag mir, dass du nicht 'Dave' bist.
@hillsons Haha, nein. Aber danke, dass ich das klären durfte;)
Wenn ein System zum Schutz hochwertiger Ziele verwendet wird, ist die Anzahl der Personen, die versuchen, es zu brechen, größer als wenn es nicht zum Schutz von Objekten von allgemein anerkannter Bedeutung verwendet wird. Wenn das System möglicherweise nicht wirklich sicher ist, ist die Wahrscheinlichkeit, dass es geknackt wird, möglicherweise höher als die Wahrscheinlichkeit, dass sich jemand die Mühe macht, ein obskures System zu knacken, das niemanden interessiert.
Erlauben Sie ihm, den Podcast "Sicherheit jetzt" von Steve Gibson auf twit anzuhören: http://twit.tv/sn, zum Beispiel Show # 444 https://www.grc.com/sn/sn-444.htm wo Sie sprechen über die Implementierung von "Telegram" (ungefähr zur Hälfte der Show).
Dave spricht davon, keine veröffentlichten Algorithmen verwenden zu wollen, verwendet jedoch MD5 (einen veröffentlichten Algorithmus) für PHP (Open Source-Projekt).
@StephenTouset großartiger Artikel über den Kruger-Effekt
Dave ist gefährlich schlecht in Kryptographie. Wie Sie wissen, fast jeder. Deshalb ist es am besten, geprüfte Standards zu verwenden, die von Experten entwickelt wurden.
@supercat Das ist dort sehr gefährlich zu denken.Low-Profile-Ziele werden ständig gehackt.Es spielt keine Rolle, dass Ihre Website keine Bank oder ein E-Mail-Server ist.Hacker versuchen, jede Benutzerbasis zu knacken, die sie können, weil sie dann eine Liste von E-Mails und Passwörtern haben, die auf einem hochkarätigen Ziel wiederverwendet werden könnten
@BooleanCheese: Ich wollte nicht darauf hinweisen, dass Systeme mit geringem Wert im Allgemeinen sicher sind, weil sie Systeme mit geringem Wert sind, sondern dass sie andere Sicherheitsrisiken aufweisen als Systeme mit hohem Wert.Angenommen, man benötigt ein Gerät, das Dinge authentifizieren kann, die daran angeschlossen sind, ohne regelmäßig eine Verbindung zum Internet herstellen zu können.Wenn das Gerät eine Zertifikatskette verwendet, die mit einer der heutigen Zertifizierungsstellen auf Stammebene verwurzelt ist und möglicherweise keine Möglichkeit zum Überprüfen des Widerrufs hat, kann ein Verstoß gegen eine Zertifizierungsstelle das Gerät verletzen.Wenn es ein Zertifikat verwendet ...
... System, das auf seinem Hersteller basiert, wäre anfällig für Schwachstellen in diesem System, aber das ist eine andere Reihe von Risiken.
Elf antworten:
Polynomial
2012-12-18 20:58:02 UTC
view on stackexchange narkive permalink
  / ** Daves selbstgebrauter Hash ^ H ^ H ^ H ^ H ^ Hkinda dummer Algorithmus * /// Benutzerdaten $ user = ''; $ password = ''; // Zeitstempel, "zufällig "# $ time = date ('mdYHis'); // Angreifern bekannt - völlig sinnlos // ^ auch, wie jdm in den Kommentaren hervorhob, ändert sich dies täglich. sieht kaputt aus! // verschiedene Hashes für verschiedene Tage? huh? oder wird dies als Salz gespeichert? $ rand = mt_rand (). '\ n'; // mt_rand ist als Zufallszahlengenerator nicht sicher // ^ es ist noch weniger sicher, wenn Sie nur nach einer einzelnen 31-Bit-Zahl fragen. und warum ist die \ n? // Krypta gut, wenn sie richtig konfiguriert / gesalzen ist // ... außer Sie haben Krypta für den Benutzernamen verwendet? WTF. $ Crypt = crypt ($ user. $ Time. $ Rand); // Hashfunktion hash_it ($ string1, $ string2) {$ pass = md5 ($ string1); // Warum verwenden wir MD5 den gleichen Durchgang, wenn Krypta verfügbar ist? $ nt = substr ($ pass, 0,8); // < --- BAD BAD BAD - warum einen MD5-Hash mischen?!?!? $ th = substr ($ pass, 8,8); $ ur = substr ($ pass, 16,8); $ ps = substr ($ pass, 24,8); // Ernsthaft. Ich habe keine Ahnung. Warum? // ^ Mischen bringt _zero_ zusätzliche Sicherheit. es macht keinen Sinn, dies zu tun. // Und was ist mit den Variablennamen los? // und jetzt SHA1 wir es auch mit anderem Müll? wtf? $ hash = 'H'.sha1 ($ string2. $ ps. $ ur. $ nt. $ th); return $ hash} $ hash = hash_it ($ password, $ crypt); // ... bitte hör auf. es tut meinem Kopf weh.summon_cthulhu ();  

Dave, du bist kein Kryptograf. Hör auf.

Diese Methode zum Selbstbrauen bietet keinen wirklichen Widerstand gegen Brute-Force-Angriffe und vermittelt einen falschen Eindruck von "komplizierter" Sicherheit. In Wirklichkeit machen Sie kaum mehr als sha1 (md5 (pass) + salt) mit einem möglicherweise kaputten und übermäßig komplizierten Hash. Sie scheinen unter der Illusion zu stehen, dass komplizierter Code eine bessere Sicherheit bietet, aber dies ist nicht der Fall. Ein starkes Kryptosystem ist stark, unabhängig davon, ob der Algorithmus einem Angreifer bekannt ist - diese Tatsache wird als Kerckhoff-Prinzip bezeichnet. Mir ist klar, dass es Spaß macht, das Rad neu zu erfinden und es auf Ihre eigene Weise zu tun, aber Sie schreiben Code, der in eine geschäftskritische Anwendung eingeht, die Kundenanmeldeinformationen schützen muss. Sie sind dafür verantwortlich, es richtig zu machen.

Halten Sie sich an bewährte Algorithmen zur Schlüsselableitung wie PBKDF2 oder bcrypt, die jahrelange Erfahrung gemacht haben Tiefenanalyse und -prüfung durch eine Vielzahl von professionellen und Hobby-Kryptographen.

Wenn Sie eine gute Schulung zum richtigen Speichern von Passwörtern wünschen, lesen Sie die folgenden Links:

Können Sie erklären, warum dies "BAD BAD BAD" ist? Ich dachte, wiederholtes Hashing oder Verarbeiten der Hash-Eingaben kann helfen, Regenbogentabellen- oder Brute-Force-Angriffe zu vereiteln. Wie führt dies zu Schwachstellen?
@jdm Der Teil "BAD BAD BAD" bezieht sich auf das sinnlose Mischen des MD5-Hash, da er keine zusätzliche Sicherheit bietet, aber in diesem Fall ist das "wiederholte" Hashing schlecht gestaltet. Es basiert auf MD5, Krypta (was auch immer konfiguriert wird) und SHA1 auf einmal, führt aber nur wirklich 3 Berechnungen durch. Das ist bei weitem nicht genug, um GPU-basierte Bruteforce zu besiegen. Das Ganze bringt nichts als Dunkelheit und ist wahrscheinlich weniger sicher als "sha1 (md5 (Pass + Salz))" mit einem anständigen Salz. Es ist wichtig, einen geeigneten Schlüsselableitungsalgorithmus zu verwenden (siehe den ersten Link).
Vielen Dank. Ich bin genauso frustriert, glauben Sie mir. Dave ist ein großartiger Kerl und hat in der Vergangenheit hervorragende Arbeit geleistet. Seine Reaktion auf all das überraschte mich. Ihm fehlen einige grundlegende Konzepte, die mit einer einfachen Google-Suche aufgegriffen werden könnten. Ich versuche nicht, rachsüchtig oder grausam zu sein, aber ich bin fertig damit, ihm das zu erklären. Dies ist genau die Art von Feedback, die er braucht ...
@nallenscott Um fair zu sein, habe ich die gleiche Phase durchlaufen, in der ich das Programmieren gelernt habe - ich wollte alles selbst machen und bin schnell in die Falle geraten, meine eigene "Verschlüsselung" und mein Hashing zu schreiben. Dann habe ich tatsächlich etwas über echte Sicherheit gelernt und festgestellt, dass vieles, was ich zuvor geschrieben hatte, schrecklich kaputt war. Massiver Weckruf!
@Polynomial Auf jeden Fall. Und deshalb bin ich hier, um diesen Prozess für Dave zu beschleunigen. Irgendwo in den Antworten und Kommentaren befindet sich eine Offenbarung, die ihn auf den Weg der Erleuchtung treiben wird. Insbesondere Ihre war ein echter Schock :)
@Polynomial - Auch ich habe meine eigenen Krypto- und Hash-Algorithmen entworfen, aber damals war ich in der Mittelschule. Es war auf jeden Fall hilfreich, mir die erforderlichen Informationen zu liefern, um die "echten" Algorithmen zu verstehen, die ich später lernen würde.
@Casey: natürlich, erfinden Sie immer Ihre eigenen. Erstellen Sie Ihre eigene verknüpfte Liste, Ihre eigene Krypto, Ihre eigene Datenbank, Ihren eigenen Mergesort. Implementieren Sie die Algorithmen und Datenstrukturen, um sie besser zu verstehen. Dann werfen Sie die Implementierung weg - die vorhandenen sind fast immer besser. Wenn nicht, steigen Sie in das Projekt ein und verbessern Sie es! Ihre Kollegen werden Ihre Änderungen überprüfen und Feedback geben. Wenn du falsch liegst, wirst du lernen, wenn du recht hast, kommen deine Veränderungen der ganzen Menschheit zugute;)
@Polynomial Großartiger Beitrag. Bitte führen Sie auch die zeilenweise Zerstörung von [dieser Frage] (http://security.stackexchange.com/q/71934/36971) durch, wenn Sie Zeit haben.
Ich mag die übergeordnete Nachricht hinter dieser Antwort, aber es tut mir leid zu sagen, dass diese Antwort anscheinend davon ausgeht, dass ein Angreifer Zugriff auf den Code hat - was nicht selbstverständlich ist. Können Sie erklären, warum, wenn der Angreifer den Code nicht hat, dieser Algorithmus mit sha1 (md5 (pass) + salt) identisch ist? Wenn Sie den * Prozess * von Daves Durcheinander mit dem anfänglichen "md5" -Hash eindeutig nicht kennen, führt dies zu zusätzlicher Sicherheit? Ich weiß, dass Hashes / Verschlüsselung * immer noch * sicher sein sollten, da der Code für alle verfügbar ist ... aber warum sollte man in diesem Fall nicht einfach sagen, dass "$ user" und "$ password" im Code sichtbar sind ...?
@monster Siehe [Kerckhoff-Prinzip] (https://en.wikipedia.org/wiki/Kerckhoffs_Prinzip). Entwerfen Sie niemals ein System, bei dem Sie davon ausgehen, dass der Angreifer den Prozess nicht kennt. Eine kryptografische Funktion sollte auf der Geheimhaltung des Schlüssels beruhen, nicht auf der Geheimhaltung des Algorithmus.
@Polynomial Danke für den Link - ich hatte ihn schon einmal gelesen (ich glaube, Sie haben den Link in einem anderen Thread gepostet, den ich gelesen hatte). Wie gesagt, ich mag die Antwort, und vielleicht bin ich ein bisschen wählerisch, aber wenn wir Zugriff auf den Code haben, können wir leicht den "$ user" und das "$ password" sehen, egal welche Chiffre Sie verwenden, es ist irrelevant ? Wenn Sie sich Daves Code ansehen, können Sie sehen, dass er manuell "$ user" und "$ password" zuweist - wenn Sie den Code haben, haben Sie diesen! Wieder wahrscheinlich nur wählerisch.
@monster Der Zugriff auf den Code ist nicht gleichbedeutend mit dem Zugriff auf die * Werte von Variablen zur Laufzeit *. Das ist ein ganz anderes Szenario. Nur eine Offline-Kopie des Codes sollte die Sicherheit des kryptografischen Systems nicht beeinträchtigen.
@Polynomial, Ich stimme zu. Ich sage, er weist `` beide Variablen `$ user` und` $ pass` in seinem Code zu. Er weist die Variablen einer Zeichenfolge in seinem Code zu, und wir können die Zeichenfolge deutlich sehen.
@monster Dies ist eine gebräuchliche Bezeichnung für Platzhaltervariablen, weshalb im Kommentar "Benutzerdaten" angegeben sind. Sie werden mit den tatsächlichen Werten aus dem aufrufenden Code ausgefüllt.
Bietet das Mischen von Hashes nicht willkürlich ein kleines Stück Sicherheit? Sie können keine vorberechneten Hashtabellen herunterladen und verwenden, oder? (Ich liege wahrscheinlich falsch.)
@MateenUlhaq Nein, denn wenn Sie wissen, was das Shuffle ist (was Sie von einem Angreifer annehmen müssen; d. H. Kerckhoffs Prinzip), können Sie es unabhängig voneinander trivial entmischen und knacken. Es sollte auch beachtet werden, dass kryptografische Standard-Hashes zum Speichern von Passwörtern SCHRECKLICH sind.
Der Aufruf von "summon_cthulhu ()" am Ende ist eigentlich die am wenigsten gefährliche Codezeile.Schlechter Passwortschutz, der ein falsches Sicherheitsgefühl vermittelt, richtet weitaus mehr Schaden an als ein unkontrollierter Großer Alter.
Ich möchte etwas hervorheben, das beschönigt wurde: Es ist vollkommen in Ordnung, selbst zu rollen.Gehen Sie geradeaus!Tu es!Solange es nicht in Prod ist.
Ich frage mich nur, würde die Tatsache, dass er SHA1 für einen MD5-Hash verwendet, diesen nicht genauso anfällig machen wie einen MD5-Hash (der nicht gesalzen wurde)?Das heißt, ein Angreifer müsste nur eine MD5-Kollision finden, damit alles auseinander fällt, oder?
@DividedByZero Ja, mit oder ohne Salz.
"und warum die \ n?"du hast verwirrt gefragt ... darum geht es in der Dunkelheit ^^
@monster Ein cleverer Angreifer kann den Algorithmus ableiten, indem er ein Konto mit einem ihm bekannten Kennwort erstellt und dann die Schritte nach dem Diebstahl der Datenbank herausfindet.Dies setzt jedoch voraus, dass sie die Anwendung nicht einfach selbst stehlen und dekompilieren können (oder sie direkt anzeigen können, wenn es sich um ein Skript handelt).Angreifer sind unendlich klüger darin, solche Geheimnisse abzuleiten, als Verteidiger glauben wollen.Deshalb sollten Verteidiger Kerckhoffs Prinzip anwenden: Dies hält uns davon ab, anzunehmen, dass der Angreifer dümmer oder weniger effizient ist als er wirklich ist.
Konerak
2012-12-18 21:40:53 UTC
view on stackexchange narkive permalink

Vorteile eines öffentlichen Protokolls:

  • Wahrscheinlich von klügeren Leuten als Ihnen geschrieben
  • Von viel mehr Leuten getestet (wahrscheinlich einige von ihnen schlauer als Sie)
  • Von viel mehr Leuten bewertet (wahrscheinlich einige von ihnen schlauer als Sie), hat oft mathematische Beweise
  • Verbessert von viel mehr Leuten (wahrscheinlich einige von ihnen schlauer als Sie)
  • Im Moment findet nur einer dieser Tausenden von Menschen einen Fehler, viele Leute beginnen ihn zu beheben.

Nachteile eines öffentlichen Protokolls:

  • Wenn tatsächlich ein Fehler gefunden wird,
  • UND veröffentlicht
  • UND nicht schnell genug behoben wird

, beginnen Angreifer, nach anfälligen Websites zu suchen / Anwendungen. ABER:

  • Sie werden wahrscheinlich zuerst wichtigere Ziele verfolgen.
  • Wenn der Fehler aufgedeckt wird, wissen Sie, dass Sie ihn sperren können.
  • Nicht Alle Fehler sind "kritisch" (die meisten sind wie "Kollisionen sind unter bestimmten Bedingungen möglich" oder "die Zeit bis zur Bruteforce beträgt nicht 10 12 Jahre, sondern 10 6 Jahre").

Sicherheit durch Dunkelheit wird als absolut schlecht angesehen. Das Erfinden Ihrer eigenen fällt unter diese Kategorie.

Für bekannte Algorithmen, wenn Sie kein professioneller Kryptograf sind, sollte wahrscheinlich durch definitiv ersetzt werden.
"Wahrscheinlich von klügeren Leuten als Ihnen geschrieben" - Sie gehen davon aus, dass 'Dave' die Existenz solcher zugibt.
Jedes Passwort kann als "Sicherheit durch Dunkelheit" bezeichnet werden. Aber in einem guten System ist bewiesen, dass das Passwort das ** einzige ** ist, was Sie geheim halten müssen. Ein ungetestetes System weist mit ziemlicher Sicherheit andere Mängel auf, sodass beim Schutz des Kennworts jemand einen Angriff ausführt, den Sie nicht erwartet haben. Aus diesem Grund möchten Sie einen Algorithmus, der brutal angegriffen und als stark befunden wurde.
@NathanLong: Ein wichtiger Punkt zu Passwörtern / Schlüsseln: Wenn man den Verdacht hat, dass seine Geheimnisse kompromittiert wurden, kann man die Sicherheit einfach und sicher wiederherstellen, indem man z. 25 transparente Würfel würfeln und die Werte verwenden, um ein Passwort oder einen Schlüssel zu generieren (64+ Bit Entropie); Jeder Würfelwurf ist im Wesentlichen so gut wie jeder andere, vorausgesetzt, der Feind findet nicht heraus, was er war.
Wenn Sie mit * klug * Leute meinen, die sich mit Kryptographie besser auskennen ...
KeithS
2012-12-18 23:03:01 UTC
view on stackexchange narkive permalink

Wenn Dave wirklich "Ihr" Entwickler ist, da Sie die Berechtigung haben, ihn zu entlassen, haben Sie die Berechtigung, ihn anzuweisen, ein besser dokumentiertes Schema zu verwenden, und Sie sollten.

In der Kryptographie ist es umso besser, je weniger Geheimnisse aufbewahrt werden müssen. Dies gilt insbesondere für "fest codierte" Geheimnisse wie die Hash-Funktion selbst, die keine Geheimnisse sind, sobald der Code, der das Geheimnis enthält, Ihr Gebäude verlässt.

Aus diesem Grund sind offene Standards für die Kryptografie a gute Sache; Wenn es das Schema schon seit Jahren oder sogar Jahrzehnten gibt, der grundlegende Algorithmus und verschiedene Implementierungen öffentlich bekannt sind und immer noch niemand einen Weg gefunden hat, hineinzukommen, ist es ein gutes Schema.

In diesem Fall lieferte Polynom eine sehr gute Aufschlüsselung der Fehler im Schema, aber hier sind die Hauptfehler des vorgeschlagenen Hash-Algorithmus:

  • MD5 ist vollständig fehlerhaft ; Während ein Preimage-Angriff durch die primäre Art und Weise, wie MD5 beschädigt wird, nicht viel einfacher wird (es ist extrem anfällig für Kollisionen mit bekanntem Klartext; wenn man die Nachricht und den Digest kennt, kann man in 2 ^ 24-Zeit eine Kollision erzeugen), das Hashing Der Algorithmus ist viel zu schnell, um gegen moderne verteilte Cracking-Hardware sicher zu sein. Es sollte niemals in Anwendungen verwendet werden, die Datensicherheit erfordern.

  • SHA-1 wird als anfällig angesehen ; Auch hier gibt es keinen eleganten Vektor für einen Preimage-Angriff, aber es gibt einen starken Kollisionsangriff (2 ^ 61 Mal für einen 160-Bit-Hash), und der Hashing-Algorithmus ist schnell genug und der Schlüsselbereich klein genug, damit die aktuelle Hardware realistisch brutal werden kann -force it.

  • Mehr Hashes bedeuten nicht unbedingt besseres Hashing . Hashes sind ein deterministischer Prozess; Sie stehen für ein "zufälliges Orakel" in der theoretischen Kryptographie, aber da sie bei derselben Eingabe immer dieselbe Ausgabe erzeugen müssen, können sie dem, was der Eingabe bereits inhärent ist, keine Entropie hinzufügen.

    Einfach ausgedrückt, die Verwendung einer geheimen Kombination mehrerer Hashes wie Dave, selbst wenn diese Kombination unbekannt ist, fügt einer Brute-Force keinen nennenswerten Arbeitsaufwand hinzu (die relative Reihenfolge von drei Hashes bietet 6 Möglichkeiten). Erhöhen Sie die Komplexität, alle Möglichkeiten auszuprobieren, um weniger als 3 Potenzen von 2), und diese zusätzliche Komplexität verschwindet, sobald ein Angreifer Ihren Code dekompilieren und die relative Reihenfolge der Hash-Funktionen ermitteln kann.

  • Passwörter haben von Natur aus eine niedrige Entropie . Die besten "vom Benutzer konsumierbaren" (Nicht-Kauderwelsch) Passwörter weisen eine maximale Komplexität von etwa 50 Entropiebits auf, was bedeutet, dass sie geknackt werden können, wenn Sie eine Vorstellung davon haben, wonach Sie suchen, in 2 ^ 50 oder einer besseren Zeit . Dadurch lassen sich Passwörter leichter knacken als andere Dinge, die Sie normalerweise hashen würden (z. B. Zertifikat-Digests), und es ist ein zusätzlicher "Arbeitsnachweis" erforderlich, um die Sicherheit zu erhöhen.

  • Dieses Schema fügt keinen signifikanten Arbeitsnachweis hinzu ; Drei Hashes anstelle von einem fügen im großen Schema der Dinge dem Schema das Äquivalent von ungefähr 1,25 Bit Entropie hinzu, wenn zusätzliche Arbeit erforderlich ist. Sie könnten es besser machen, wenn Sie nur verlangen, dass Kennwörter ein Zeichen länger sind.

BCrypt hat im Gegensatz zu allen oben genannten als Hauptvorteil eine extrem langsame Schlüsselableitungsfunktion oder KDF. Blowfish, die Verschlüsselungs-Chiffre, die die Grundlage von BCrypt bildet, verwendet eine "SBox". ein großes Array von vorbestimmten Anfangswerten, das durch den Schlüssel und / oder IV modifiziert wird, um den Anfangszustand der Chiffre zu erzeugen, durch die der Klartext geführt wird. In BCrypt wird dieses SBox-Setup komplexer, indem die kleineren Kennwort- und Salt-Werte eine vorbestimmte Anzahl von Malen durch die "nicht verschlüsselte" Chiffre laufen und die Chiffre in einen Zustand "aufwärmen", der theoretisch nur durch Ausführen erzeugt werden kann die gleiche Anzahl von Iterationen des Setups mit dem gleichen Passwort und Salt. Dieser "aufgewärmten" Chiffre wird dann ein konstanter Klartext zugeführt, um den Hashwert zu erzeugen. In CS-Begriffen bildet der Hash einen "Arbeitsnachweis"; Eine Rechenaufgabe, die schwierig (zeit- und / oder ressourcenintensiv) durchzuführen ist, aber leicht auf ihre Richtigkeit zu überprüfen ist (stimmt der erzeugte Hash mit dem überein, den wir bereits haben?).

Diese "vorgegebene Zahl "der Iterationen des SBox-Setups ist konfigurierbar; Dies ist die wahre Kraft von BCrypt. Beim Hashing wird eine Anzahl von "Runden" des Schlüssel-Setups angegeben, und für n Runden werden 2 ^ n Iterationen des Schlüssel-Setups durchgeführt. Das bedeutet, dass durch Erhöhen der Anzahl der Runden der Hash doppelt so viel Arbeit leistet und auf derselben Hardware doppelt so lange benötigt, um den erforderlichen Arbeitsnachweis zu erstellen. BCrypt kann daher leicht mit Moores Gesetz Schritt halten, das der Fluch vieler vorheriger Hash-Funktionen war.

Die größte theoretische Schwäche von BCrypt ist die geringe Speichernutzung. Während die Rechenzeit exponentiell erhöht werden kann, bleibt die benötigte Speichermenge effektiv konstant (die SBox wird mit zunehmenden Iterationen nicht größer und es müssen keine "Zwischenergebnisse" beibehalten werden). Während BCrypt die reine Pipeline-Rechenleistung einer GPU behindert, bleibt es als anfällig für Cracking durch ausgefeiltere "feldprogrammierbare Gate-Arrays" (im Grunde genommen ein massiver, hochmodularer Satz von "weich verdrahteten" Logikeinheiten) aktueller Stand der Technik im Bereich hochverteiltes Rechnen), da aufgrund der geringen Speicherbeschränkungen nur relativ kostengünstigere Leiterplatten auf das Problem geworfen werden können.

Ein neuerer Algorithmus, SCrypt, bekämpft FPGA-Cracker Durch exponentielles Erhöhen des Speicherbedarfs sowie des Rechenaufwands für die Berechnung des Hashs macht der begrenzte Speicher, der jedem FPGA zur Verfügung steht, diese ebenfalls schnell unmöglich (verteiltes Cracken würde grundsätzlich eine große Anzahl von CPU / FSB / RAM-Kombinationen erfordern, im Wesentlichen volle Computer zusammengehakt). Das einzige Problem besteht darin, dass SCrypt erst 2 oder 3 Jahre alt ist und daher nicht den kryptoanalytischen Stammbaum von BCrypt (13 Jahre alt) hat. Und wirklich, wenn Sie sich Sorgen machen müssen, dass ein FPGA-bewaffneter Cracker in möglicher Zeit ein Passwort erhält (wie bevor Sie sowieso alle ändern können), haben Sie einige sehr mächtige Leute angepisst und haben bereits eine weitere schwerwiegende Sicherheitsanfälligkeit aufgedeckt (die es einem Angreifer ermöglicht, Ihre gespeicherten Passwort-Hashes zu erhalten, damit er eine "offline" knacken kann)

Verwenden Sie unter dem Strich BCrypt für das Passwort-Hashing. Es ist 13 Jahre alt und basiert auf einem 20 Jahre alten Verschlüsselungsalgorithmus. In dieser Zeit wurden keine bekannten Schwachstellen gefunden, die einem Passwort-Cracker helfen könnten. Es ist langsam wie Melasse und kann so konfiguriert werden, dass es immer so ist, vorausgesetzt, Sie müssen es mit der Anforderung kombinieren, dass Benutzer ihr Kennwort etwa alle 90 Tage ändern müssen, damit neue Kennwörter immer häufiger mit teureren Konfigurationen gehasht werden.

Erstens ist SHA1 160 Bit. Zweitens spielt es keine Rolle, für Kollisionsangriffe (2 ^ (n / 2) bis Brute Force) gebrochen zu werden, wenn Sie ein Hash-Passwort knacken (wo Sie sich über (erste) Pre-Image-Angriffe Gedanken machen - 2 ^ n bis rohe Gewalt); Siehe: http://en.wikipedia.org/wiki/Preimage_attack. Für Kryptosignaturen kann kein kollisionsbruchhafter Hash (und SHA1 ist in 2 ^ 61 Zeit gebrochen) nicht verwendet werden (da signierte Nachrichten geändert werden könnten). (Obwohl die Einfachheit und Geschwindigkeit von MD5 und die Existenz großer Regenbogentabellen bedeuten, dass es für Passwörter schlecht ist.) Stimmen Sie jedoch Ihren Argumenten für bcrypt zu.
Lange Diskussion über Preimage-Angriffe, Kollisionen, Hashing-Stärke usw. Gelöscht
Weitere Informationen zu Kollisionsangriffen im Vergleich zu Vorbildangriffen, die von der alten Form dieser Frage inspiriert sind, finden Sie in der [zweiten Hälfte meiner Antwort] (http://security.stackexchange.com/a/25598/2568).
Ich verwende MD5, um schöne Farben in meinen Diagrammskripten zu erstellen - nicht zum Sichern von Passwörtern
Am besten wäre es vielleicht, Ihren Hash sowohl über SCrypt * als auch über * BCrypt auszuführen, und dann erhalten Sie die Vorteile von beiden, und Schwachstellen in einem von ihnen werden Ihren Hash nicht trivialisieren.
@Muhd - Das Problem mit Ihrer Annahme ist, dass beide Algorithmen so konzipiert sind, dass sie der Berechnung eine nicht triviale, aber akzeptable Zeitkomplexität hinzufügen (und die Komplexität kann variiert werden, um dieses Gleichgewicht zu erreichen). Wenn Sie sie in Reihe ausführen, verdoppeln Sie entweder die Zeit, die ein Benutzer auf eine legitime Kennwortüberprüfung warten muss, oder die Stärke jedes Algorithmus muss um die Hälfte reduziert werden. Komplexität ist der Feind der Sicherheit; Je mehr es den Status Quo stört, desto wahrscheinlicher wird Ihr System von Ihren eigenen Benutzern "angegriffen".
@KeithS Wenn Sie dieselbe Zeit verwenden und davon ausgehen, dass es keinen Angreifer gibt, der einen Exploit für einen der beiden Algorithmen ausführt, haben Sie mehr Sicherheit, wenn Sie die Hälfte der Zeit für SCrypt verwenden, als wenn Sie die gesamte Zeit für BCrypt verwenden. SCrypt ist um Größenordnungen leistungsfähiger, sofern keine Sicherheitslücke besteht. "Komplexität" ist auch nicht der Feind der Sicherheit, solange die Leute, die das System aufbauen / warten, es verstehen können, obwohl es der Feind der Bequemlichkeit sein kann. Und es gibt keine Unannehmlichkeiten für den Endbenutzer beim Passwort-Hashing, da sich alles hinter den Kulissen befindet.
AiliwkxjywCMT Gute Idee!
Oh mein Gott, ich hasse Unternehmen so sehr, wenn sie alle 90 Tage ein Passwort zurücksetzen müssen. Es ist so frustrierend.Mach das nicht.Ihr Unternehmen ist nichts Besonderes, es sei denn, Sie sind Facebook oder Google. Es ist nicht einmal wahrscheinlich, dass Ihre Benutzer Ihre Seite so oft besuchen. Sie fordern Ihre Benutzer auf, ihr Passwort fast jedes Mal zurückzusetzen, wenn sie Ihre Website besuchen, was absurd ist.
dr jimbob
2012-12-18 22:33:10 UTC
view on stackexchange narkive permalink

Um Dave gegenüber fair zu sein, ist dies in Bezug auf die Sicherheit von Homebrew-Passwörtern einer der besseren Fälle, da alles nur eine kleine Verschleierung (und wirklich nicht viel) ist, die hash = SHA1 (salt + MD5 '(Passwort) maskiert. ) wobei MD5 ' einen reversiblen Austausch der Reihenfolge der Bytes des MD5-Hashs durchführt. Jetzt wird der Benutzername / Zeit / Zufall / Krypta-Teil nur verwendet, um ein Salz zu erzeugen, und die einzige Anforderung, die wir an Salze haben, ist, dass sie nur eine sehr gute Wahrscheinlichkeit der Eindeutigkeit haben müssen; Obwohl es zu kompliziert ist, hat es wirklich keinen Sinn, darüber zu sprechen.

Wieder hash = sha1 ($ salt + md5 '($ password)) . Durch das Neuanordnen des MD5 wird keine Sicherheit hinzugefügt ( swap (00112233445566778899aabbccddeeff) wird zu ccddeeff8899aabb0011223344556677 ) Tauschen). Das Vorhandensein des einzigartigen Salzes macht die Regenbogentabellen jedoch unmöglich.

Um kritisch zu sein, läuft dies auf eine einfache kryptografische Hash-Funktion hinaus, die zweimal angewendet wird. Dies ist besser als das Speichern von Klartext-Passwörtern (siehe Klartext-Straftäter) und besser als das Speichern eines ungesalzenen Hashs (siehe Linkedin-Leck). Im Zeitalter billiger massiv paralleler GPUs ist dies jedoch für den modernen Einsatz zu schwach. Jeder mit ein wenig Erfahrung in der GPU-Programmierung für allgemeine Zwecke, der irgendwie auf den Live-Server gelangt ist (um die Hashes mit seinem Salz zu erhalten), kann wahrscheinlich seinen Quellcode sehen, sein eigenes Passwort als Testfall ausprobieren und dann jedes brutal erzwingen bestimmtes Passwort mit einer Rate von Milliarden von Versuchen pro Sekunde pro GPU.

Wenn also ein Benutzer ein Kennwort in einer Liste von etwa einer Million zuvor durchgesickerten Kennwörtern verwendet (z. B. von LinkedIn), kann der Angreifer es fast augenblicklich knacken. Wenn das Passwort eines Benutzers ein zufälliger 8-Buchstaben aus dem Zeichensatz A-Za-z0-9 ist; Es würde durchschnittlich etwa 60 Stunden dauern, um pro GPU zu brechen (wenn Sie also 60 GPUs hätten; würde 1 Stunde dauern). Die Verwendung gängiger Cracking-Techniken, bei denen Formen gängiger Kennwörter ausgenutzt werden, könnte dies erheblich beschleunigen. Es ist auch erwähnenswert, dass, da $ password eine 128-Bit-MD5-Hashing-Funktion durchläuft, die Verwendung von mehr als 128-Bit-Entropie in der Passphrase absolut keinen Vorteil bringt (obwohl dies fairerweise sehr wichtig ist sicheres Passwort (wie eine 10-Wort-Diceware-Passphrase oder ein zufälliges alphanumerisches Passwort mit 22 Zeichen).

Wirklich, Sie sollten iterierte kryptografische Hash-Funktionen verwenden. Das ist so etwas wie bcrypt oder PBKDF, das die Brute-Force-Rate von Angreifern um einen großen konstanten Faktor verlangsamt (z. B. 10 5 sup>) (also statt 60 Stunden, um ein zufälliges 8-Zeichen-Passwort von a zu knacken 62-Zeichen-Set (A-Za-z0-9); mit einer einzelnen GPU dauert es 6 Millionen Stunden (~ 700 Jahre, bis es wahrscheinlich kaputt geht), und dies wird mit stärkeren Passwörtern besser (z. B. würde ein 10-Zeichen-Passwort ~ dauern 3 Millionen Jahre; selbst mit einer Million GPUs würde es 3 Jahre dauern. Eine kleine Tastenverstärkung verschiebt also ein relativ schwaches Passwort (8 zufällige Zeichen aus 62 Zeichen) aus dem Bereich der Machbarkeit, von einem Angreifer geknackt zu werden. Weitere Informationen Die Obergrenzen für die Verwendung eines einfachen, durch Tastenverstärkung verstärkten Kennworts finden Sie in dieser Antwort.

Kollisionsangriffe im Vergleich zu Pre-Image-Angriffen (oder warum Kollisionsangriffe auf eine Hash-Funktion für das Kennwort-Hashing irrelevant sind)

KeithSs Antwort, obwohl es gute Ratschläge gibt (verwenden Sie bcrypt und keine einfache kryptografische Hash-Funktion, um Ihr Passwort zu hashen), kritisierte MD5 und SHA1 ursprünglich für die falsche Begründung (verwenden Sie MD5 nicht als dessen anfällig für Kollisionsangriffe). Es gibt einen subtilen Unterschied zwischen Vorbild- und Kollisionsangriffen, und die Argumentation in den Kommentaren war zu komprimiert, daher werde ich hier näher darauf eingehen. Ich empfehle dringend, den Wikipedia-Artikel über Pre-Image-Angriffe zu lesen.

Ein Pre-Image-Angriff besagt, dass ein bestimmter 128-Bit-Hash hexadezimal geschrieben ist: h = ad2baf26a87795b3c8a8366a08b44112 , eine bestimmte Hash-Funktion H , finden Sie eine Nachricht m , so dass h = H (m) ; Es ist zu beachten, dass es N = 2 128 verschiedene unterschiedliche Hashes gibt. Wenn Ihre kryptografische Hash-Funktion nicht unterbrochen ist, hat jedes Bit in Ihrem Hash eine 50% ige Chance, 0 oder 1 für eine zufällige Nachricht m zu sein. Dann muss ich im Durchschnitt Hashes für ungefähr N = 2 128 Hashes generieren, bevor ich das Glück habe, eine Nachricht m zu finden, so dass h = H (m ) (Diese Nachricht ist möglicherweise nicht dieselbe Eingabe, die ursprünglich zum Generieren des Hashs verwendet wurde. Dies fällt jedoch immer noch unter die Kategorie "Pre-Image" -Angriff.)

Ein Kollisionsangriff sagt, finde mir zwei beliebige Nachrichten m1 und m2 , so dass H (m1) = H (m2) . Beachten Sie, dass m1 , m2 (und H (m1) ) alle frei geändert werden können. Dieser Fall ist ein viel einfacheres Problem, da ich, wenn ich M Hashes für M verschiedene Nachrichten generiere, nicht nur die M Nachrichten mit einem bestimmten Hash vergleiche (also M Chancen haben, eine Kollision zu finden), sondern jetzt M * (M- 1) / 2 Paar Hashes, also ungefähr M ^ 2 Chancen auf eine Kollision. In diesem Fall muss ich also ungefähr sqrt (N) ~ 2 64 sup> -Hashes generieren, bevor es wahrscheinlich ist, dass einer von ihnen mit einem anderen auf einem idealen 128-Bit-Hash kollidiert. P. >

Schauen wir uns die beiden Arten von Geburtstagsproblemen an. Das Kollisionsproblem führt zu dem üblichen "Paradoxon" zum Geburtstag. Wie viele Personen brauchen Sie in einem Raum, bevor zwei Personen einen Geburtstag mit N = 365 Tagen im Jahr haben? Die Antwort ist paradox, da Sie nur ungefähr sqrt (N) ~ 23 Personen benötigen, bevor sich wahrscheinlich zwei Personen einen Geburtstag teilen (wie bei 23 Personen in einem Raum haben Sie 253 verschiedene Personenpaare, die übereinstimmen könnten). (Ich weiß, dass sqrt (365)! = 23: Ich verwende eine ungefähre Mathematik, die sich nicht auf unbedeutende konstante Faktoren konzentriert. Wiederholen Sie die Berechnung mit sqrt (365) ~ 19 Personen im Raum und dann P (zwei gemeinsame Geburtstage) ) = 19! * Comb (365,19) / 365 ** n = 37,9% , was zwar nicht streng 50% bedeutet, aber dennoch bedeutet, dass es ziemlich wahrscheinlich ist). Hinweis für das Kollisionsgeburtstagsproblem: Sie können nicht N + 1 = 366 Personen in einem Raum haben und es besteht die Möglichkeit, dass Sie keine Kollision haben (Schalttage ignorieren). Bestenfalls hatten die ersten 365 Personen unterschiedliche Geburtstage und die letzte Person verursachte eine Kollision.

Das Problem vor dem Bild ist eine ganz andere Frage: Wie viele Personen brauche ich in einem Raum, bevor dies sehr wahrscheinlich ist? Jemand hat einen bestimmten Geburtstag (sagen wir B = 18. Dezember). In diesem Fall brauche ich ungefähr N ~ 365 Leute, bevor es wahrscheinlich ist. Beispiel: Bei 365 Personen im Raum haben Sie ein P (jemand hat Geburtstag B) = 1 - (1 - 1/365) ^ (# Personen) , also für # Personen = 365 Sie haben eine 63% ige Chance, dass jemandes Geburtstag ein festes Datum B ist. In diesem Fall können Sie sich leicht vorstellen, dass sich eine beliebige Anzahl von Personen in einem Raum befindet und niemand an einem bestimmten Datum Geburtstag hat. (Angenommen, Sie haben nur Personen in den Raum eingeladen, wenn der Geburtstag kein bestimmtes Datum war. Die Anzahl der Personen, die Sie einladen können, ist unbegrenzt.)

Wenn eine Hash-Funktion wie MD5 / SHA1 für Kollisionsangriffe unterbrochen wird, bedeutet dies, dass Sie eine Kollision in weniger Arbeit als der Brute-Force-Zeit von sqrt (N) ~ 2 numbits / 2 sup> erzeugen können. Für MD5 dauert es nur etwa 2 bis 24 Stunden, um eine Kollision zu erzeugen. für SHA1 dauert es ~ 2 ^ 61 Zeit. Das bedeutet, dass Kollisionsangriffe auf MD5 extrem einfach durchzuführen sind. Praktische Angriffe auf SHA1 sind jedoch immer noch schwierig. Kollisionsangriffe sind jedoch nur dann von Bedeutung, wenn es Ihnen egal ist, mit welchem ​​Hash Sie übereinstimmen möchten. Diese Kollisionsangriffe sind für einige Anwendungen wie das kryptografische Signieren von Nachrichten sehr relevant, um die Nachrichtenintegrität sicherzustellen. Achten Sie daher in diesen Fällen auf die Verwendung von MD5 / SHA1. Wenn Sie jedoch ein eindeutiges Salz und einen bestimmten Hash haben, den Sie zur Authentifizierung abgleichen möchten, spielen Kollisionsangriffe keine Rolle.

Rory Alsop
2012-12-19 17:24:43 UTC
view on stackexchange narkive permalink

enter image description here

Siehe den entsprechenden Beitrag zum Security Meme

Obwohl dies sehr simpel erscheint, gelten die Regeln - Entwerfen von Krypto-Algorithmen und Implementieren sie richtig / sicher ist sehr schwer. Sogar diejenigen, die von Experten entworfen und im Laufe der Jahre von Tausenden von Menschen ausgewählt wurden, haben irgendwann Löcher entdeckt.

Also Rollen Sie nicht Ihre eigene Krypto ist ein guter Rat für alle (möglich) Ausnahmen sind Persönlichkeiten wie Rivest, Adleman, Pornin, Shamir)

Witzig und mit dem Gefühl einverstanden, aber es ist irrelevant, da er keine eigene Chiffre geschrieben hat. Er übernahm die vorhandenen Krypto-Hash-Funktionen "MD5" und "SHA1" zusammen mit der benutzerdefinierten Permutationsfunktion "dumm_perm" ("dumm_perm (" 00112233445566778899aabbccddeeff ")" und ging zu "ccddeeff8899aabb0011223344556677", also "Hash = SHA1" (MD5 (pw))) `und erzeugten ihr Salz auf übermäßig komplizierte Weise. Obwohl sie ihre Wartungskosten erhöht haben, um keinen Sicherheitsgewinn zu erzielen, erstellen sie keine eigene Verschlüsselung. Der Fehler besteht darin, dass einfache Hashes heutzutage zu schnell sind und daher eine Schlüsselverstärkung erforderlich ist.
Ich denke, das größere Problem ist, dass das Beispiel der Frage eher eine Schlüsselschwächung als eine Schlüsselstärkung ist. Es ist vielleicht keine neue Chiffre, aber es fällt auf die gleichen Fallstricke herein.
@drjimbob-Chiffre! = Hash
@bradley.ayers - Ich verstehe den Unterschied (Chiffren werden für die Verschlüsselung verwendet; Hashing ist keine Verschlüsselung, da es nicht umkehrbar ist.) Das Meme-Bild verwendete zuerst das Wort "Chiffre", und ich kritisierte Rory nicht als kryptografische Hash-Funktion wie MD5 und SHA1 basiert auf Algorithmen, die Blockchiffren ähneln: http://en.wikipedia.org/wiki/Cryptographic_hash_function#Hash_functions_based_on_block_ciphers Dave hat jedoch keine eigenen Chiffrier- / Hash-Funktionen oder ähnliches erstellt. Er hat lediglich eine dumme Permutation eines MD5 in einem Schritt eines schwachen Hashing-Schemas (`sha1 (salt + md5 (pw)`) durchgeführt.
Man schreibt nicht einfach die eigene Chiffre besser
Es ist erwähnenswert, dass Rivest und seine Freunde keine eigene Krypto gerollt haben. Sie widmeten allen anderen bedeutende Teile ihres Lebens der Krypto. Persönlich würde ich es nicht an einer großen Firma mit Milliarden zum Schutz vorbeiziehen lassen, einige professionelle Kryptogurus einzustellen, um Krypto (warum klingt das wie ein Drogenbegriff) für die Verwendung innerhalb des Unternehmens zu rollen.
Mark Burnett
2012-12-20 02:58:41 UTC
view on stackexchange narkive permalink

Obwohl wir mit Daves Algorithmus viele Fehler finden können, ist es wirklich nicht schrecklich , weil es nicht zu 100% hausgemacht ist. Er verwendet Hashing-Protokolle, die (wenn auch schwach) auf soliden Prinzipien basieren. Andererseits unternimmt er Schritte, die die Komplexität für den Entwickler erhöhen, aber wenig zur Verbesserung der Sicherheit seines Algorithmus beitragen.

Aber der Grund, warum ich hier eine weitere Antwort hinzufüge, ist das uralte Argument, dass Dunkelheit einen Wert hat. Die primäre Verteidigungslinie sollten immer starke, allgemein akzeptierte Hashing-Algorithmen sein, aber es schadet nicht, selbst die kleinste Menge an Dunkelheit als zusätzliche Verteidigungsschicht hinzuzufügen.

Diese Schicht der Dunkelheit sollte niemals als Verteidigung an sich betrachtet werden, sondern lediglich als zusätzlicher Faktor, der die Wahrscheinlichkeit eines Kompromisses verringert. Da für einen erfolgreichen Angriff normalerweise eine Reihe von Faktoren erforderlich sind, können selbst kleine Abwehrkräfte einen großen Einfluss auf die Reduzierung Ihres Gesamtrisikos haben.

Ich kann Ihnen nicht sagen, wie oft ich Hash-Dumps gesehen habe, die ich zu knacken versucht habe, wo ich einfach nichts bekomme, weil irgendwo Dave an diesen dummen Nicht-Standard-Algorithmus gedacht hat, den ich nicht knacken kann ohne eine intensive Kryptoanalyse durchzuführen oder in die Webserver einzudringen, um den Algorithmus zu erhalten. Sie können nicht leugnen, dass diese dummen Algorithmen ein gültiger Abwehrfaktor sind.

Wenn Dave nun seinen dummen Algorithmus als Schicht zu stärkeren Algorithmen wie PBKDF2 oder bcrypt hinzugefügt hat, hat er Unklarheiten mit dem Unterstützung solider Sicherheitspraktiken. Außerdem muss Dunkelheit nicht so komplex sein wie Daves Code. Alles, was Sie wirklich brauchen, ist ein bisschen anders zu sein, um dunkel zu sein. Denken Sie daran, dies ist keine Verteidigung, sondern nur eine Schicht der Dunkelheit.

Bessere Möglichkeiten, um Dunkelheit zu erreichen, sind die Verwendung eines HMAC, die Verkettung einer serverseitigen Salzkonstante und / oder die Verwendung einer großen, nicht standardmäßigen Anzahl von Iterationen. Keine dieser Maßnahmen steht für sich allein, aber sie befassen sich mit Sicherheit mit bestimmten Angriffsmethoden, die zu Ihrem Gesamtrisiko beitragen.

tl: dr; Sicherheit durch Dunkelheit ist schlecht, aber solide Sicherheit plus ein angemessenes Maß an Dunkelheit ist eine gültige Strategie.

In der Tat ist Daves Algorithmus im Wesentlichen gesalzener HMAC mit einer kleinen Wendung. Es scheint so stark zu sein wie HMAC. Zum Beispiel kann der Angreifer den Regenbogentisch eines anderen nicht verwenden. Meine größte Sorge bei diesem System ist, wo Salz gespeichert wird.
@qarma HMAC verwendet das Geheimnis (d. H. Das Passwort) zweimal, dieser Algorithmus verwendet es nur einmal.
GdD
2012-12-18 21:11:11 UTC
view on stackexchange narkive permalink

OK, feuere Dave ab. Zumindest schlug ihn mit einem sehr großen Hinweisschläger. Offene Protokolle sind gut, da jeder nach Schwachstellen und strukturellen Problemen suchen und versuchen und Korrekturen implementieren kann. Die Sichtbarkeit verbessert das Protokoll. Gute Sicherheit bedeutet, dass jeder wissen kann, wie das System funktioniert, und dass es dennoch sicher ist.

Glauben Sie immer noch, dass in allen offenen Systemen alle Lücken gefunden und behoben werden und daher die sichersten Systeme sind, wenn man die Lecks der letzten Jahre betrachtet, die gezeigt haben, dass NSA und CIA Schwachstellen für sich behalten und Exploits entwickelnaus verschiedenen kaum rechtlichen Gründen von ihnen?Wenn sie es können (die sogenannten "Guten"), können die sogenannten "Bösen" es nicht auch ("Chinesisch / Russische Hacker" und so weiter)?
Sie verwechseln Design mit Implementierung @a20,. Auf jeden Fall glaube ich nicht, dass das Schließen hilft. Die meisten Schwachstellen, auf denen die US-Regierung nicht sitzt, befinden sich in geschlossenen Systemen, zum Beispiel MS-Betriebssystemen.
"Die meisten Schwachstellen, auf denen die US-Regierung nicht sitzt, befinden sich in geschlossenen Systemen".Was meinten Sie damit, dass ich Design mit Implementierung verwechsle?
@a20 Ich bin sehr spät zu dieser Party, aber ich vermute, dass GdD sich auf die Tatsache bezog, dass diese realen Schwachstellen, von denen Sie sprechen, selten grundlegende Fehler in einem kryptografischen Standard sind, häufiger sind sie Fehler in derArt und Weise, wie ein Softwareprodukt den Standard verwendet oder implementiert.Wenn ich beispielsweise eine Implementierung eines offenen Protokolls schreibe, das anfällig ist, weil ich einen Zeitstempel anstelle eines Krypto-PRNG als Startwert verwendet habe, ist diese Sicherheitsanfälligkeit ein Beweis für eine Schwachstelle in meiner Implementierung, nicht unbedingt im offenen Protokoll.Und geschlossene Systeme sind hier wohl anfälliger.
Sarel Botha
2012-12-18 22:22:56 UTC
view on stackexchange narkive permalink

Überzeugen Sie ihn mit guten Überlegungen. Beschimpfe ihn nicht.

Sie müssen darüber nachdenken, warum wir Hashing-Passwörter verwenden: Der Grund dafür ist, das ursprüngliche Passwort zu schützen, indem der Hashing-Prozess viel CPU-Zeit in Anspruch nimmt, um ausgeführt zu werden. Brute Force ist die Art und Weise, wie die Passwörter normalerweise wiederhergestellt werden.

Wenn der Angreifer Ihre Kennwortdatenbank stehlen kann, hat er es geschafft, auf Ihre Datenbank zuzugreifen. Wenn sie Zugriff auf die Datenbank haben, haben sie wahrscheinlich auch Zugriff auf den Code, der diese Kennwörter erzeugt. Nach Überprüfung des Codes können sie damit beginnen, die Kennwörter brutal zu erzwingen, da die Ausführung des Hashing-Algorithmus zu wenig Zeit in Anspruch nimmt.

Die Idee hinter bekannten Hashing-Methoden und -Praktiken wie mit PBKDF2 mit 10.000 Iterationen bedeuten, dass die Ausführung auf der aktuellen Hardware viel Zeit in Anspruch nimmt.

Wenn Sie etwas Zeit zur Verfügung haben, können Sie auch ein Brute-Forcing-Programm schreiben und ihm zeigen, wie viele Angriffe Sie pro Sekunde ausführen kann mit seinem Algorithmus gegen vorherrschende Standards ausführen.

Nur weil sie auf die Datenbank zugreifen können, heißt das nicht, dass sie Zugriff auf seinen Code haben.
@jmoreno rechtfertigt sein nutzloses Schema immer noch nicht.
@Thomas: ist wahr, und der Grund für die Ablehnung von bcrypt ist einfach nicht zu unterstützen. Dies bedeutet jedoch nicht, dass Ihr Code bei der Verwendung der Standardbibliotheken und -praktiken keinen Wert hinzufügen (oder entfernen) kann.
@jmoreno Im Allgemeinen wird Sicherheit durch Dunkelheit als Krücke für schlechte Kryptografiepraktiken angesehen, und dies ist häufig der Fall. Das bedeutet nicht, dass es keinen Wert hat - es hat seine Verwendung, aber in dieser Situation ist es nicht gerechtfertigt.
@jmoreno, richtig, deshalb habe ich 'wahrscheinlich' gesagt. Der Hauptpunkt ist, dass das Hashing einige Zeit dauern muss.
Phillip Schmidt
2012-12-20 22:10:56 UTC
view on stackexchange narkive permalink

Ich habe mehrere Hashing-Algorithmen geschrieben. Es ist nichts falsch daran, wenn Sie wissen, was Sie tun. In sehr geringem Maße hat er Recht damit, dass bewährte Algorithmen etwas anfälliger für Angriffe sind. Wenn Sie also einen guten -Algorithmus erstellen können, sind Sie goldrichtig. Das einzige Problem ist, dass er aus einer Reihe von Gründen total scheiße ist.

  1. // Zeitstempel, zufälliges # $ time = Datum ('mdYHis');

    Ich habe nicht einmal das Gefühl, dass ich das erklären muss. Er hat versucht, eine gesetzte "Zufallszahl" zu erstellen, wenn dies keinen Sinn ergibt. Die Hashes ändern sich von Tag zu Tag. Ich kann mir nicht vorstellen, dass dies in einem vernünftigen Szenario funktioniert.

  2. Er sagt, dass er von bekannten Hashing-Algorithmen abweichen möchte, verwendet jedoch MD5 (das bekannteste von allen und ein faires) auch schwach) für den Großteil "seines" Algorithmus. Seine Methode ist nur eine sehr leichte Ableitung von einfachem ole MD5-Hashing. Das bringt mich zu:
  3. Er mischt sein MD5-Ergebnis. Äh, warum? Bitten Sie ihn als lustige kleine Aktivität, seine Argumentation dort zu erklären. Und ich gebe Ihnen einen Tipp, um Ihnen zu helfen: Was auch immer seine Antwort ist - es ist falsch. Das Mischen eines Hash-Werts ist wie das Mischen eines Kartenspiels mit leeren Karten. Es gibt keinerlei zusätzlichen Nutzen daraus.
  4. ol>

    Es gibt auch mehr Dinge, die daran falsch sind, aber dies sind die großen. Sagen Sie ihm, er soll zu seiner gewohnten Arbeit zurückkehren und einfach bcrypt (oder scrypt verwenden, was wahrscheinlich sogar etwas sicherer ist, um die Tatsache zu tun, dass es wirklich CPU-intensiv ist).

Ja, Sie können Ihre eigenen schreiben, aber die meisten Leute, die glauben, dass sie qualifiziert sind, ihre eigenen zu schreiben, sind nicht qualifiziert, ihre eigenen zu schreiben. Es ist leicht zu beurteilen, wie schlau wir sind, aber schwer zu beurteilen, wie dumm wir sind.
Ich denke, der Grund für das Mischen ist, dass sich der Algorithmus von allem unterscheidet, was ein Angreifer (der den Algorithmus nicht kennt) erwartet. Die Verwendung eines anwendungsspezifischen geheimen Salz-Inputs (auch bekannt als "Pfeffer") hat den gleichen Effekt und ist zuverlässiger.
Zu # 3: Ein gemischter MD5-Hash kann nicht in einer Regenbogentabelle nachgeschlagen werden.
LateralFractal
2013-09-11 13:55:10 UTC
view on stackexchange narkive permalink

Die Steganographie würde besser von Daves Betriebsgeheimnis profitieren als die Kryptographie. Dies könnte das sein, was Dave intuitiv anstrebte.

Kryptografie

Jede kryptografische Lösung profitiert von einer größtmöglichen Belichtung , weil sie sich darauf verlässt Ein anderes Geheimnis als der private Schlüssel erschwert die Betriebssicherheit für einen Krypto-Konsumenten viel . Ein Schlüssel ist ein einzelnes, einfach zu verwaltendes, tragbares, vorhersehbares und genau definiertes Sicherheitsrisiko, bei dem Krypto-Experten große Anstrengungen unternommen haben, um sicherzustellen, dass alle Risiken im Algorithmus auf only beschränkt sind der Schlüssel.

Schlüssel können nicht erraten werden (hohe Entropie), um Brute-Force- oder Seitenkanalangriffe zu erfordern. Geheimnisse in anderen Aspekten eines Algorithmus können nicht als unschätzbar angesehen werden, da jeder andere Aspekt eines Verschlüsselungsalgorithmus in eine universelle Klasse von (möglicherweise schwächeren) Verschlüsselungsalgorithmen + einen konstanten Wert verallgemeinert werden kann. Dieser konstante Wert repräsentiert die gesamte verbleibende invariante Entropie in der Struktur oder Verschleierung des Algorithmus. Dieser Wert ist in einem Home-Brew-Algorithmus niemals besonders groß oder entropisch und in jedem nicht selbstmodifizierenden Computerprogramm von Natur aus konstant. Ein Angreifer kann entweder die Quelle erfassen und diese (geringfügige) Entropie direkt entfernen oder den Chiffretext über eine verallgemeinerte Klasse von Algorithmen ausführen. Die NSA würde dies beispielsweise genau für unbekannte Varianten gängiger Algorithmen tun, die von ausländischen Mächten verwendet werden.

Steganographie

Jede steganographische Lösung profitiert von der geringste öffentliche Exposition , da der Angreifer beim Verbergen des Ortes von Geheimnissen seine Suche auf eine für dieses Opfer möglicherweise einzigartige Weise anpassen muss; und skaliert auf die Menge möglicher Verstecke und Versteckmethoden, die dem Opfer zur Verfügung stehen.

Dies kann so einfach sein, als ob Sie eine gefälschte Hash-Passwortspalte haben und die echte in vier (64-Bit) time_t -Spalten in verschiedenen Tabellen ausblenden, in denen Benutzerinformationen aufgezeichnet werden. Dies kann so komplex sein wie das Ausblenden von a Tragbare Linux-Emulation in einem BluRay-Film.

Steganografie basiert letztendlich auf der Erstellung oder Änderung eines Artefakts, das eine öffentliche semantische Bedeutung oder einen öffentlichen Zweck und einen sekundären privaten semantischen Sinn oder Zweck hat. Eine Person oder Organisation profitiert davon, sekundäre semantische Bedeutungen auf die gleiche Weise zu verbergen wie jede Lüge durch Unterlassung. Sei es " Meine Socke ist langweilig und enthält keine Diamanten " oder " Dies sind die Hashes, nach denen Sie suchen. Ignorieren Sie diesen Honeypot oder diese Socket-Verbindung zu einem Audit-Server ".

In Kombination

Dave sollte also öffentlich geprüfte High-Level-Bibliotheken wie BouncyCastle anstelle eines Home-Brews von Low-Level-Krypto-Primativen verwenden. Sie sollten sich jedoch frei fühlen, damit der Hacker, der durch die Serverökologie navigiert, das Gefühl hat, ein Brainfuck -Programm zu lesen, dem einige Zeichen fehlen.

Vorausgesetzt, die vollständige Supportdokumentation wird für Daves Nachfolger an einem sicheren Offline-Speicherort aufbewahrt ...

Mark Buffalo
2015-11-17 02:38:46 UTC
view on stackexchange narkive permalink

Ich werde einen anderen Ansatz versuchen, um dies zu beantworten. Ich werde Ihnen nicht sagen, dass etwas schlecht ist, und nicht erklären, warum. Ich werde Schritt für Schritt genau erklären, warum es schlecht ist, und zeigen Ihnen, wie Sie es brechen können, aber ich werde nicht zu tief in die Regenbogentabellen gehen ... es wird davon ausgegangen, dass Sie wissen, was das ist ist.

Hier ist der Grund, warum der Hash Ihres Entwicklers falsch ist: weil er nur einige Faktoren einführt, die nach der Entdeckung der Methode völlig brutal erzwungen werden könnten, selbst wenn er das Mischen zufällig auswählen würde.

Wie? Denn wenn ich Zugriff auf Ihren Server habe, kenne ich auch die Methode, mit der Ihr Entwickler Ihr Kennwort hasht, weil ich diesen Code ebenfalls gestohlen habe, und ich kann alles neu anordnen, um es meiner kleinen Crackpot-Anwendung anzupassen.

Nehmen wir an, ich habe Ihr Unternehmen gehackt und Zugriff auf Ihre Datenbank erhalten, damit ich diese Hashes erhalten kann. Ich weiß, wann sich Benutzer registrieren, richtig? Ich weiß, wann sie ihr Passwort zuletzt geändert haben, denn wenn Sie kein Neuling sind, sollten Sie diese Informationen in der Datenbank protokollieren.

  $ time = date ('mdYHis');  

Dieser Zeitstempel ist wahrscheinlich ungefähr zu der Zeit, zu der der Benutzer sein Passwort registriert oder geändert hat. Wir können dies wissen, da das letzte Mal, als es aktualisiert wurde, in der Datenbank gespeichert werden sollte. Die Zeit, die Sie registriert haben, sollte in der Datenbank gespeichert werden. Ein Teil der Krypta wurde besiegt.

  $ rand = mt_rand (). '\ n';  

Cool, ein Zufallszahlengenerator. Wissen Sie, auf Computern ist nichts wirklich zufällig. Zufallszahlengeneratoren sind nicht wirklich zufällig. Dies ist der Mersenne Twister . Ich brauche nur 624 verschiedene Kombinationen, um alle zukünftigen Zahlen herauszufinden. Ich habe auch Ihr "Salz" aus der Datenbank gestohlen und weiß, wie Sie es berechnen.

Da ich die Daten kenne, an denen sich Ihre Benutzer registriert haben, kann ich die richtige Nummer für die Mersenne Twister-Routine zu diesem bestimmten Zeitpunkt neu erstellen. Ich kann eine kleine Cracking-Methode schreiben, um die genaue Zahl zu ermitteln, die zu diesem Zeitpunkt wahrscheinlich auftreten würde. Dein Salz ist nicht mehr zufällig. Aber weißt du was? Es ist irrelevant. Ich kenne das genaue Format, das Sie für dieses Salz verwenden, und ich habe es wahrscheinlich trotzdem aus Ihrer Datenbank erhalten. Dann kann ich Rainbow Tables verwenden, um Ihr Salz in weniger als einer Sekunde vollständig zu vernichten, da mt_rand () allein maximal 10 ^ 10 Hashes und ein Minimum von erzeugt 10 ^ 9 , was 11 Milliarden Möglichkeiten bedeutet, und da alle Zahlen sind und ich das Format Ihres Salzes kenne, werden sie in weniger als einer Sekunde geknackt.

Also jetzt Ich weiß, wem dieser Benutzername gehört, weil ich Ihre Datenbank aufgebockt habe. Ich weiß, wann sie sich registriert haben, wann sie ihr Passwort zuletzt geändert haben und ich kenne Ihre Zufallszahl. Ich sehe dich, Dave, einen Dieb auf dem Dach. Meine neue Satellitenverbindung hat sowohl Infrarot- als auch Röntgenspektrum. Ich sehe dein Herz schlagen. Ich sehe, Sie haben Angst.

Nachdem $ crypt besiegt wurde, werfen wir einen Blick auf die -Funktion hash_it () .

  -Funktion hash_it ($ string1, $ string2) {$ pass = md5 ($ string1); $ nt = substr ($ pass, 0,8); $ th = substr ($ pass, 8,8); $ ur = substr ($ pass, 16,8); $ ps = substr ($ pass, 24,8); $ hash = 'H'.sha1 ($ string2. $ ps. $ ur. $ nt. $ th); return $ hash}  

Schauen wir uns nun einige Beispieleingaben an: hash_it (Dave, testpassword1);

Ergebnisse:

  $ pass = "b7e055c6165da55c3e12c49ae5207455" $ nt = "b7e055c6"; $ th = null; $ ur = "3e12c49a"; $ ps = "e5207455";  

$ hash Input : "H" + "Benutzername +" Registrierungsdatum "+" 1604716014 "+" e5207455 "+" 3e12c49a "+" b7e055c6 "(tldr: "HDaveRegistrationDate1604716014e52074553e12c49ab7e055c6" )

  $ hash = 'H'.sha1 ("DaveRegistrationDate1604716014e52074553e12c49ab7e055c6);  

` $ hash output : "6b347a1521b6b84501806268614abe1e7324c703; Zeit)

So könnte ein Angriff funktionieren :

  1. Mersenne Twister ( mt_rand () ) nach 624 brechen Beobachtungen oder einfach Rainbow Table das Salz.
  2. Nimm Daves REGISTRATION_DATE aus der Datenbank oder den USER_LAST_MODIFIED_DATE
  3. Nimm Daves SHA1 Hash
  4. Initiieren Sie einen Brute-Force-Angriff (er wird zu einem statischen sha1-Hash, nachdem wir Ihre "Sicherheit" verletzt haben) mit den folgenden Parametern:
    • "Benutzername" + "RegistrationDate" + YourRandomNumber + DictionaryAttack[‹
  5. ol>

    Und das ist die Geschichte, warum Sie Ihre eigene Kryptographie nicht rollen sollten, es sei denn, Sie wissen wirklich, was Sie tun. Stellen Sie sich vor, ich wäre ein echter Cracker. und nicht so jemand, der gerade Ihren Code rückwärts durchgesehen hat.

Und was ist, wenn Sie nicht wie angenommen auf den Code zugreifen können?
@monster Natürlich habe ich Zugriff auf den Code. Es ist PHP und er versucht, seine Datenbank zu schützen, die ich bereits gestohlen habe. Das Hashing von Passwörtern dient dazu, Ihre Benutzer zu schützen, sobald Sie verletzt wurden. Wenn ich Ihre Datenbank abrufen kann, ist es eine triviale Aufgabe, die restlichen wichtigen Dateien auf dem Webserver abzurufen.
Lassen Sie uns [diese Diskussion im Chat fortsetzen] (http://chat.stackexchange.com/rooms/32054/discussion-between-mark-hulkalo-and-monster).
@MarkBuffalo `Natürlich habe ich Zugriff auf den Code.Es ist PHP und er versucht, seine Datenbank zu schützen. Es gibt viele Situationen, in denen SQLi das Dumping der Datenbank zulässt, ohne die PHP-Dateien abzurufen.Das bedeutet natürlich auch, dass Dave nur einen Pfeffer verwenden sollte, da er das gleiche Bedrohungsmodell erfüllt, aber nicht so ... kaputt ist.


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...