Passwörter sicher abspeichern

  • Hi!

    Aus gegebenem Anlass möchte ich euch etwas Kryptographie näher bringen.
    Man sieht in diversen Tutorials, dass empfohlen wird, Passwörter mit MD5 zu "verschlüsseln". Jedes Mal, wenn ich das lese, kann ich nur meinen Kopf schütteln:

    MD5 ist keine Verschklüsselung. MD5 ist ein Hash-Verfahren - und Hashverfahren zielen auf andere Ziele ab, als Passwörter zu verschlüsseln, sondern für digitale Signaturen. Das sieht man auch an dem Fakt, dass jede Verschlüsselung eigentlich einen Schlüssel benötigt.

    Dementsprechend schlecht "verschlüsselt" man mit MD5 auch. MD5 kann von diversen kostenlosen Programme innerhalb von ein paar Stunden geknackt werden. Wenn man mathematisch an die Sache rangeht, wird es sogar noch leichter.

    Zitat von Klaus Schmeh, einem renommierten Kryptographen und Autor: "Inzwischen ist es sogar möglich, Kollisionen auf einem gewöhnlichen PC innerhalb von Stunden zu berechnen [Klima]. MD5 ist damit endgültig tot." (Kryptographie, dpunkt.verlag, Seite 224)

    Deshalb möchte ich euch ein anderes Verfahren zur Verschlüsselung wichtiger Daten vorstellen: RSA. RSA ist ein asymmetrisches Verfahren, das von Ron Rivest, Adi Shamir und Leonard Adleman entwickelt wurde. Dieses Verfahren besitzt zwei Schlüssel: Einen öffentlichen und einen privaten. Alles, was der öffentliche Schlüssel verschlüsselt, kann der private entschlüsseln - und umgekehrt.
    RSA gilt nach heutigem Wissensstand als praktisch unknackbar - jedenfalls ohne Real World Angriffe.

    Anbei findet ihr ein Script, das sowohl die RSA-Schlüssel berechnen, als auch die Verschlüsselung durchführen kann. Dieses Script benötigt eine aktivierte BC Math Library.
    Außerdem beherrscht das Script auf die AES-Verschlüsselung (Advanced Encryption Standard) - ein Verfahren, das von diversen US-amerikanischen Ministerien zur Verschlüsselung von Top-Secret-Dokumenten vorgeschrieben wird.

    Die Idee hinter der RSA-Passwort-Verschlüsselung ist, dass der öffentliche Schlüssel zur Verschlüsselung verwendet wird - der private könnte dies wieder entschlüsseln. Wenn jedoch der private Schlüssel nicht abgespeichert wird, existiert keine Möglichkeit mehr, das Passwort zu entschlüsseln. Wird der öffentliche Schlüssel gespeichert, kann nur VERschlüsselt werden.

    Das angehängte Archiv enthält noch diverse große Primzahlen, die zur Schlüsselberechnung verwendet werden. Diese Liste kann beliebig erweitert werden.

    Anwendung

    Die Klasse RSA_Handler enthält die Funktion get_random_key(). Diese gibt einen Array zurück, das alle wichtigen Werte für den Schlüssel beinhält: Die Zahlen N, D und E.
    Der private Schlüssel besteht aus N und D.
    Der öffentliche Schlüssel besteht aus N und E.
    Aus N und E ist nach heutigem Stand der Technik D nicht zu berechnen.

    Wenn nun eine Verschlüsselung stattfinden soll, muss die Methode encrypt() übergeben werden. Die Parameter der Funktion sind:
    $m ... Der Text
    $e ... Öffentlicher Schlüssel - E
    $n ... Öffentlicher Schlüssel - N

    Die ausgegebene Zeichenkette ist der Geheimtext - der verschlüsselte Text.

    Wenn nun der Geheimtext, N und E gespeichert werden, kann jederzeit das Passwort überprüft werden. Es kann aber nicht wiederhergestellt werden, solange die Zahl D nicht gespeichert wird.

    Liebe Grüße
    Dodo :)

  • Coole sache ;) was wäre nun aber, wenn man selbst ein paar, c.a. 100, zeilen schreibt, die einen string einfach sinnslos herumwürflen und das benutzt, es ist ja niemandem bekannt? Ich bin sicher, in ein paar jährchen wird man D auch nach 2 - 3 stunden rechnen wissen.

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

    Einmal editiert, zuletzt von Tobse (13. August 2010 um 20:06)

  • Das wäre Security by Obscurity ;) Das klappt nur manchmal.
    In der Kryptographie verlässt man sich außerdem auf Verfahren, die lange existieren und ausgiebig auf etwaige Schwächen getestet wurde..

    Dein Verfahren würde schon durch die einfachste Kryptoanalyse - Wahrscheinlichkeitstabellen - geknackt werden ;)
    RSA wurde 1977 entwickelt. Und bis heute - mit der modernen Computertechnik gibt es keine wirkungsvollen Schwachstellen gegen den Algorithmus. Nur gegen die Implementierung - aber auch eher wenige, schwer durchführbare.

    Something big is coming. And there will be pirates and ninjas and unicorns...

  • Das heisst, wenn ich also in ner fremden datenbank im passwortfeld asvcjegfirw finde, probiert man einfach n paar tage dran rum und weiss dann, wie der alg. Funktioniert? Oder hat man nur durh durchprobieren möglichst vieler zeichenkokbinationen den passenen klartexf gefunden?

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • Wenn das so ist, muss man nur alle Möglichkeiten rumprobieren.
    Und schon hat man es.
    Das, was du hier erläuterst ist eine einfache Permutation.
    Ein gutes symmetrischen Verfahren besteht aus Permutation, Substitution und diversen Bit-Operationen.

    Something big is coming. And there will be pirates and ninjas and unicorns...

  • Naja, aber mal angenommen, niemand ausser evl. Die leute im projekt haben zugriff auf den code, der die passwörter für ein portal verschlüsselt, wie kann man das dann knacken? Man kann nur rumprobieren, das hilft aber auch nur einmal. Wenn ich in einer db auf eine RSA verschlüsselung stoße und habe n und e, dann kann ich doch auch rumprobieren, bis ich das korrekte habe, sogar ohne n und e, die kann man dann eben auchnoch rumprobieren. Führt zwar zu x^3 möglichkeiten, aber warten kostet ja nichts.

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • Naja, aber mal angenommen, niemand ausser evl. Die leute im projekt haben zugriff auf den code, der die passwörter für ein portal verschlüsselt, wie kann man das dann knacken? Man kann nur rumprobieren, das hilft aber auch nur einmal.


    Per Brute.Force (Rumprobieren) oder der Macht der Mathematik ;)
    Glaub mir, es gibt Varfahren, die du dir nicht erträumen kannst: Z. B.: Lineare- und differentielle Kryptoanalyse oder Regenbogentabellen (für Hashverfahren)
    Das alleine rumgeschiebe kann rückgerechnet werden. Und wenn die Anordnung einmal berechnet wurde, kann sie auf alle anderen Angewandt werden.

    Wenn ich in einer db auf eine RSA verschlüsselung stoße und habe n und e, dann kann ich doch auch rumprobieren, bis ich das korrekte habe, sogar ohne n und e, die kann man dann eben auchnoch rumprobieren. Führt zwar zu x^3 möglichkeiten, aber warten kostet ja nichts.

    Hier eine kleine Berechnung, die ich in meiner Arbeit über Kryptologie von Klaus Schmeh übernommen habe: (Mallory ist der Hacker)

    Es gibt 2^128 = 3,4 · 10^38 Schlüssel.
    * Verwendet Mallory einen speziellen Hochleistungschip, der 10 Millionen Schlüssel pro Sekunde durchprobieren kann, dann dauert das Durchprobieren aller Schlüssel 3,4 · 10^31 Sekunden.
    * Besitzt Mallory nicht nur einen, sondern eine Million dieser Chips, dann kann er denselben Vorgang in 3,4 · 10^25 Sekunden schaffen.
    * Hat Mallory großes Glück, dann stößt er schon auf den richtigen Schlüssel, nachdem er nur 1 Prozent aller Schlüssel durchprobiert hat. In diesem Fall benötigt er nur noch 3,4 · 10^23 Sekunden.
    * 3,4 · 10^23 Sekunden entsprechen etwa 10^16 Jahren. Zum Vergleich: Das Alter des Universums liegt bei etwa 10^10 Jahren. Wir müssten also die Zeit seit dem Urknall eine Million Mal verstreichen lassen, um auf den gewünschten Erfolg zu kommen.

    Klaus Schmeh hat in demselben Buch noch eine Rechnung über den benötigten Energieverbrauch angeführt. Bei einem speziellen energiesparenden Supercomputer, der pro Schlüssel nur 10^-12 Joule benötigt (was eine sehr utopische Vorstellung ist), müssten alle Kraftwerke der Erde 100 Jahre lang nur für den einen Rechner Energie erzeugen, damit er 1 Prozent der Schlüssel durchprobieren kann. Die Stromrechnung würde 9,4 · 10^15 Euro betragen.

    Du siehst: Bei angemessen großen Schlüsseln - die durch entsprechend große Primzahlen berechnet werden - dauert das "Ausprobieren" ziemlich lange ;)

    RSA basiert auf dem Faktorisierungsproblem und dem diskreten Logarithmus:

    Faktorisierungsproblem:
    Man kann leicht zwei Promzahlen miteinander multiplizieren. Es ist jedoch sehr schwer, eine große Zahl in ihre zwei Primfaktoren zu zerlegen.

    Diskreter Logarithmus:
    "f(x) = a^x mod n" ist bei bekanntem a und n leicht zu berechnen.
    Umgekehrt: "x = log_a f(x) mod n" ist äußerst schwer zu berechnen.


    Glaub mir, wenn die größten Kryptographen jahrelang an sicheren Verfahren arbeiten, dann bringen diese einfachen Verfahren, die du hier beschreibst kaum etwas. Jemand, der sich im entferntesten mit Kryptoanalyse beschäftigt hat - was so ziemlich jeder Hacker gemacht hat - kann das knacken.

    Something big is coming. And there will be pirates and ninjas and unicorns...

  • Oha, wo kommen wir denn da hin? Wenn das so ist, dann ist doch gedankenleeen in 10 jahrn routine bei der polizei ;)
    Danke für die aufklärung!

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • Man möchte ja auch ein Passwort nicht verschlüsseln bzw entschlüsseln !

    Md5/Sha + Salt in Stunden knackbar, soso her damit^^

  • Man möchte ja auch ein Passwort nicht verschlüsseln bzw entschlüsseln !

    Ich hoffe, das meinst du jetzt nicht ernst. Wozu sollte man ein Passwort lieber signieren, als verschlüsseln wollen? O.o
    Bitte sag, dass das nicht dein Ernst war. Man legt Passwörter grundsätzlich verschlüsselt ab. Dass man sie nicht mehr entschlüsseln will, verstehe ich... Aber warum bitte nicht VERschlüsseln? O.o

    Md5/Sha + Salt in Stunden knackbar, soso her damit^^

    Also, ich glaube einem renomiertem Kryptographen und Autor (Klaus Schmeh) eher, als dir ;)
    Kannst ja mal in Google oder einer anderen Suchmaschine deiner Wahl suchen. Da findet man diverse Programme. Das geht bei AES nicht.

    Something big is coming. And there will be pirates and ninjas and unicorns...

  • Klasse Beitrag :cool:
    Was ich mich aber gleich frage: siehst Du eine Möglichkeit RSA auch bei in MySQL gespeicherten Passwörtern zu verwenden? Ich meine: gibt es dort eine Funktion in MySQL statt der php-Klasse von dir?

  • Klasse Beitrag :cool:

    Danke :)

    Was ich mich aber gleich frage: siehst Du eine Möglichkeit RSA auch bei in MySQL gespeicherten Passwörtern zu verwenden? Ich meine: gibt es dort eine Funktion in MySQL statt der php-Klasse von dir?

    In MySQL wurde RSA meines Wissens nicht implementiert.
    Ich löse das aber jetzt so: Ich generiere einmal einen RSA-Schlüssel, den ich einfach im Quelltext oder in einer Datei (durchaus auch Klartext) ablege.
    Damit kann ich die eingegebenen Daten verschlüsseln.
    Der verschlüsselte Wert wird mit SHA-1 oder MD5 gehasht, damit er nichtmehr so viel Platz einnimmt und eine fest definierte Länge hat.
    Damit ist also einfach aus $pass = md5($pass); das hier geworden: $pass = md5(RSA_Handler::encrypt($pass, $e, $n));

    Auch, wenn der Hacker in die Datenbank kommt und vor dem Hashwert steht, kommt er maximal bis zum RSA-Geheimtext.
    Der ist eine unüberwindbare Brücke.

    Damit kann RSA problemlos in MySQL implementiert werden.

    Something big is coming. And there will be pirates and ninjas and unicorns...

  • Wenn ich etwas nicht wieder entschlüsseln möchte nehme ich einen HASH

    MD5 lässt sich auch heutzutage noch nicht zurückverfolgen, ich sehe keinen Mehrwert in einer Verschlüsslung gegenüber einen Hash, keiner zwingt dich zu MD5 gibt ja auch andere Hashfunktionen falls dir Md5 nicht sympathisch ist

    Ansonsten finde ich es auch ein gutes Thema über RSA

  • Wenn ich etwas nicht wieder entschlüsseln möchte nehme ich einen HASH

    Aber wenn du etwas verschlüsseln willst, bist du mit einem Hashverfahren auch and er falschen Stelle.
    Asymmetrische Kryptographie ohne privaten Schlüssel kann nicht mehr entschlüsseln. Gar nicht mehr.
    //Edit: Fehler behoben

    MD5 lässt sich auch heutzutage noch nicht zurückverfolgen, ich sehe keinen Mehrwert in einer Verschlüsslung gegenüber einen Hash, keiner zwingt dich zu MD5 gibt ja auch andere Hashfunktionen falls dir Md5 nicht sympathisch ist

    Alle heute entwickelten Hashverfahren weisen entweder diverse Schwächen auf oder sind noch zu jung, um ausführlich getestet worden zu sein.

    Something big is coming. And there will be pirates and ninjas and unicorns...

    Einmal editiert, zuletzt von Dodo (14. August 2010 um 01:09)

  • Wird langsam spät was :)
    Also privaten Key meinst du wohl anstatt Hash.

    Verschlüsseln und Hashen sind 2 unteschiedliche Dinge, ich will kein Passwort verschlüsseln!
    Man kann auch keinen Hash entschlüsseln


    mfg
    Meyerchen

  • Verschlüsseln und Hashen sind 2 unteschiedliche Dinge, ich will kein Passwort verschlüsseln!
    Man kann auch keinen Hash entschlüsseln

    Also du signierst lieber ein Passwort, als es zu verschlüsseln? Obwohl Kryptologie die Lehre der Geheimhaltung von Daten ist?

    MD5 wurde nie dafür geschaffen Daten unkenntlich zu machen, sondern dafür, digitale Signaturen zu erstellen.
    RSA wurde entwickelt, um Nachrichten geheim zu versenden. Das Verfahren basiert auf dem Diffie-Hellman-Schlüsselaustausch, der dafür geschaffen wurde kryptographische Schlüssel - das essentielle Stück einer Verschlüsselung - geheim zu halten.

    Ich vertraue lieber einem Verfahren, das für die Geheimhaltung entwickelt wurde, als einem Verfahren, das zum signieren von Daten entwickelt wurde.

    Was das NIST zur SHA-Familie zu sagen hat, kannst du hier nachlesen:
    http://csrc.nist.gov/groups/ST/hash/index.html
    Und SHA ist ähnlich aufgebaut, wie die MD-Algorithmen... Es wird sogar behauptet, dass SHA-1 sicherer als MD5 ist...

    Something big is coming. And there will be pirates and ninjas and unicorns...

  • Damit kann RSA problemlos in MySQL implementiert werden.

    Genauer gesagt nutzt Du ja nur PHP für die Verschlüsselung, das hat dann nichts mit MySQL zu tun ;) Ich fragte, nur weil ich durchaus auch Projekte habe in denen ich kein PHP nutze und es auch nicht nutzen kann. Man müsste scheinbar diese PHP-Klasse auch in anderen Programmiersprachen (Perl, C++, ASP, ..) umsetzen :o

  • MD5 ist damit endgültig tot


    Das habe ich schon vor Jahren gehört und totzdem ist md5 aktuell wie eh und je und wird es vermutlich auch noch lange bleiben. Um Passwörter in z.B. Foren unkenntlich zu machen, reicht das locker!

  • Ja ich benutze einen Hash für ein 1 Wegverfahren

    Sha1 bietet weniger Kollisionen von dem her ist es auch sicherer, du könntes die Bitzahl auch ziemlich hochstellen bei Sha

    Md5 und Sha1 ist nicht das beste ja aber es gibt ja auch alternative Hashverfahren und es werden neue kommen


    mfg

  • Genauer gesagt nutzt Du ja nur PHP für die Verschlüsselung, das hat dann nichts mit MySQL zu tun ;) Ich fragte, nur weil ich durchaus auch Projekte habe in denen ich kein PHP nutze und es auch nicht nutzen kann. Man müsste scheinbar diese PHP-Klasse auch in anderen Programmiersprachen (Perl, C++, ASP, ..) umsetzen :o

    In anderen Sprachen gibt es teilweise ganz gute Implementierungen.
    Für C++ braucht man jedoch Libraries, wie http://gmplib.org/
    Die Schlüssel sind relativ groß. In PHP kann man das über Strings lösen.

    Something big is coming. And there will be pirates and ninjas and unicorns...