Beiträge von Dodo

    Das Problem bei Hashs ist, dass bereits eine Kollision ausreicht, um sich bei Logins mit gehashten Passwörtern Zutritt zu verschaffen. Da hilft nicht einmal ein Salt.
    Diese Kollisionen sind bei RSA absolut unmöglich.

    Zu deiner Anwendung: Für kurze Texte ist RSA bestens geeignet. Bei längeren Texten würde ich aufgrund der Performance auf symmterische Verfahren, wie zum Beispiel AES (Advanced Encryption Standard - Rijndael) zurückgreifen.
    Oder hybride Verfahren, in denen der Schlüssel für ein symmetrisches Verfahren mit RSA verschlüsselt ist.

    Mein kläglicher Versuch sieht wie folgt aus

    HTML

    Code
    <ul>
        <li class="no_bg"><h4>Tag 1 - Samstag, 24 Juli 2010</h4></li>
    </ul>

    CSS

    Code
    .no_bg {
        background-color: transparent;
    }

    Den CSS Code habe im Anschluss es im ersten Beitrags geposteten Codes eingetragen und ist somit die letzte Bedingung in dieser CSS Sparte.



    Versuchs mal damit ;)

    Code
    #content_list li.no_bg h4 {
        background-color: transparent;
    }

    Ja, ich hätte auch eine Beschwerde :/

    Ich vermisse das Breadcrumb-Menü über dem Footer. Das war eigentlich meine zentrale Navigation durch das Forum.
    Im Header ist es ja noch da, aber ich muss jetzt immer nach oben scrollen, um das zu Erreichen :/

    Danke, ich dachte D hängt immer von N E und dem text ab, dann wärs ja unmöglich. Aber kann man nun unter verwendung von D texte sprachenunabhängig ver-/ent- schlüsseln? Wenn die schlüssel (laut dodo) so verschieden sind, ist mit das fragwürdig.

    RSA basiert auf Mathematik. Mathematik funktioniert immer gleich.
    Das ist ein theoretischer Algorithmus, der mit ziemlich jeder Sprache nachprogrammiert werden kann.
    Du kannst RSA - mit kleinen Schlüsseln - mit Stift und Papier nachrechnen.
    Das hier ist nur eine Implementierung in PHP. In PHP geht das dank der BC Math Library recht einfach. Es entstehen unter Umständen Schlüssel > 100 Bit. Mit PHP kann man das schön berechnen. Bei anderen Sprachen benötigt man entsprechende Funktionen, da es kaum so große Variablen gibt.
    Aber die eigentliche Funktion von RSA - das Modulo-Potenzieren - kann in jeder Sprache realisiert werden.

    Wenn du Nachrichten per RSA sichern willst: Angenommen, du willst mir eine Nachricht schicken:
    Ich berechne N und E. Daraus ergibt sich D.
    Ich stelle nun N und E öffentlich zur Verfügung. Jeder, der mir eine Nachricht schicken will, verschlüsselt sie mit N und E. Aber nur N und D können diese Nachricht wieder entschlüsseln. Da nur ich D kenne - und das auch immer so bleiben sollte - bin ich der Einzige, der das rückrechnen kann.

    Hab ich doch gesagt RSA. Wenn ich einen text mit php verschlüssle und abspeichere, kann ich dann, natürlich durch übertragung von D diesen text mit c++ entschlüsseln kder andersrum. Das man md5 nicht entschlüsseln kann weiss ich, soll man ja auch nicht können.

    D wird NIEMALS übertragen.
    Du generierst im Normalfall verschiedene Schlüssel auf beiden Seiten.
    Der öffentliche Schlüssel wird ausgetauscht. Damit wird verschlüsselt. Und der private Schlüssel entschlüsselt das wieder.

    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.

    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...

    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.

    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.

    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.

    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.

    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.

    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.

    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 :)