Hallo,
dort hat eine 1024-bit-entschlüsselung ca 1.3 sekunden
Ja, und was passiert wenn du mal etwas mehr als 1 Wort verschlüsselst/entschlüsselst?
Wie gesagt, man kann bei 1024 max. 127 Byte pro Durchgang verschlüsseln.
Dein letzter Post hat rund 1000 Zeichen, also knapp 10 Blöcke, also rund 18 Sekunden (wobei der JavaScript vorher abbricht).
Original von skamster19
was vieleicht noch zu sagen ist: empfindlichere sachen wie passwort u.ä werden vor dem verschlüsseln vorgehasht
Hier muss man aber vorallem replay Attacken ausschließen, sowie besteht dort die Gefahr, dass es ausreicht, den Hash zu kenne um sich einzuloggen.
Aber ich hab mir gerade dein dein 'Paper' angeguckt, und ehrlich gesagt, es ist mist. Zuerst einmal ignorierst du scheinbar konsequent den Nutzen von symmetrischen Algorithmen.
Dann, wie du dort schon erwähnt hast, ist die erste Übergabe extrem unsicher.
Wenn ich den gesamten Verkehr mitschneide, erhalte ich den private Key des Users...
Evt. zuerst lesen, wie Schlüsselaustausch-Verfahren funktionieren und versuchen dieses nachzuempfinden.
Ein Blick wie SSL arbeitet dürfte auch nicht schaden.
Im Groben sollte es so sein (mit z.B. RSA):
1. Server sendet an den User seinen (festen und sicheren) public Key sowie eine zufällige Zahl.
2. Der Client erstellt einen zufälligen Wert, indem er folgendes bildet:
md5([Userinfos] + [Zufallszahlen] + [Was sonst noch so da ist])
Dieses verschlüsselt er mit dem public Key des Servers.
Der Sitzungsschlüssel ist dann: md5([Zahl vom Server] + md5([Userinfos] + [Zufallsdaten]+ [Was sonst noch so da ist]))
3. Der Client sendet seinen zufälligen Wert an den Server, der Server kann dann damit den Sitzungsschlüssel berechnen und speichert den Key in einer Session.
Alternativ mit Diffie-Hellman (ich mag das Verfahren):
1. Server bildet g^x mod p, g und p sind fest, x muss zufällig sein (hier wieder das Problem mit guten Zufallszahlen, wenn man auf /dev/urandom zugreifen ideal).
Das Ergebnis sendet er an den Client (steht im JS was an den Client gesendet wird).
2. Der Client bildet eine Zufallszahl y (kann wie unter 2. bei RSA berechnet werden), berechnet g^y mod p, und kann den (zufälligen) Sitzungsschlüssel damit errechnen, welcher abgespeichert wird.
An den Server muss er nur noch g^y mod p übertragen, sowie die verschlüsselten Daten mit dem Sitzungsschlüssel (+ sym. Verfahren).
3. Der Server hat in einer Session sein g^x mod p abgespeichert, kann durch das g^y mod p an den gleichen Sitzungsschlüssel gelangen und die Daten entschlüsseln.
Der gesamte Verkehr läuft nur noch verschlüsselt über einen symmetrischen Algorithmus (z.B. Blowfish o.ä., evt. die Sboxen direkt im Cookie/Session abspeichern).
Soetwas ist nicht nur extrem viel schneller, sondern auch deutlich leichter umzusetzen.
Das größte Problem ist, an gute Zufallsdaten zu kommen.
Dies lässt sich aber zumindest halbwegs in den Griff bekommen, wenn man Diffie-Hellman verwendet und der Server halbwegs gute Zufallszahlen erstellt.
und da der schlüssel jedes mal neu erstellt wird, sehe ich die gefahr mit einem 512bit-key nicht so sehr, wenn ich ehrlich bin. wie lange ist ein benutzer normalerweise online?
Du hast wie gesagt, das Problem mit dem erstellen von Zufallsdaten.
Wenn du die Standardzufallsgeneratoren von PHP verwendest um ein zufälliges Keypair zu erstellen, dann existieren nur rund 4 Mrd. solcher Paare.
Das man diese alle schnell durchtesten kann, bzw. sogar abspeichern kann, sollte klar sein.
gut, die daten könnten gespeichert und auf dem computer des crackers angesehen werden.. aber nur für eine session.. oder wäre die sicherheitsidee dann doch zu lasch?
RSA-155, ein 512 Bit starker RSA-Key wurde 1999 faktorisiert.
Wie im
RSA Bericht zu lesen, war der Rechenaufwand rund 8000 MIPS Jahre.
Ein
Intel Core 2 Extreme QX6700 schafft rund 57000 MIPS, d.h. dieser wäre knapp 50 Tage mit der Faktorisierung beschäftigt.
Spann ich ein paar Computer ein, schaffen die das in wenigen Tagen.
Es kommt drauf an, was in deiner Session so übertragen wird. Wenn eine geknackte Session dazu führt, dass der Angreifer z.B. das Passwort erhählt, dann sind 512 Bit eindeutig zuwenig.
Aber deinen Ansatz sollte man eh nicht wählen. Dein Protokoll ist sehr unsicher und weist große Mängel auf, solch eine Seite wäre extrem langsam und die Implementierung ist viel zu aufwendig
Edit
Man hat das Problem, wie man in JS Daten lokal abspeichert.
Wenn man in JS ein Cookie setzt, so wird dieses im Klartext das nächste mal an den Server gesendet.
Zur Not müsste der Client bei jedem Seitenaufruf einen neues Sitzungsschlüssel erstellen und dem Server mitteilen, wäre aber unnötig rechenintensiv und eine Lösung über die lokale Speicherung, sofern in JS möglich, wäre besser.