Geeignete Verschlüsselung gesucht

  • VB.NET
  • .NET 4.0

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Vainamo V.

    Geeignete Verschlüsselung gesucht

    Guten Morgen aus dem wunderschönen Dänemark.

    Ich mache gerade einen Rewrite meines Chats und versuche zur Zeit die Verschlüsselung anzupassen.

    Einerseits suche ich eine geeignete Methode die einzelnen Server-Client-Kommunikationen zu verschlüsseln.
    Ich dachte hierbei an eine Art Session-Key den jeder Client generiert und bei der Anmeldung an den Server sendet. Allerdings weiß ich nicht wie man am besten den Key generiert, genauso wenig welche Verschlüsselung am besten geeignet wäre.

    Zum anderen suche ich eine Methode um die Passwörter der Benutzer zu speichern. Am Ende sollen die Passwörter verschlüsselt in einer Datenbank (testweise in einer lokalen Datei) gespeichert werden. Hier dachte ich daran die Passwörter mit sich selbst zu verschlüsseln.

    Was haltet ihr von diesen Methoden für den jeweiligen Zweck? Welche Verschlüsselungen würdet ihr empfehlen?

    Hilsen fra Danmark / Grüße aus Dänemark
    Vainamo

    Vainamo V schrieb:

    Hier dachte ich daran die Passwörter mit sich selbst zu verschlüsseln.

    Lieber einen Schlüssel, der nur deinem Server bekannt ist. Um jedoch Datensicherheit zu garantieren, wäre es eine bessere Lösung die Passwörter zu hashen, und eben dann Temporäre Paswörter zu vergeben, falls jemand seines Vergessen hat.

    Für den Chat würde es entweder der SSL-Stream tun, wenn du ein entsprechendes Zertifikat hast, oder eben die Implementierung einer RSA / AES Verbindung. Entweder schickt der Server den public Key an jeden anfragenden raus, oder der Key ist Fest in der Anwendung integriert, sodass die Clients nur mit deinem Server sprechen können.
    Post-AGB:
    §1 Mit dem Lesen dieses Posts stimmst du den AGB unverzüglich zu
    §2 Ein Widerruf muss innerhalb von 3 Sekunden nach Lesen des Hauptbestandteil des ersten jemals gelesenen Posts erfolgen
    Abs.1 Die Signatur zählt nicht zum Hauptbestandteil des Posts
    §3 Ein erfolgreicher Widerruf zwingt zu einem Besuch bei einem Hypnotiseur oder Neurochirurg, sodass der gelesene Text aus den Erinnerungen entfernt werden kann
    Abs.1 Die Kosten und Risiken sind jeweils selbst zu tragen
    Am besten, wie mein vorgänger sagte wäre eine Hybride verschlüsselung (ein mix aus aes und rsa zB.)

    dazu am besten folgendes: 2 rsa schlüsselpaare.
    diese werden jeweils gekreuzt abgelegt: ein privatekey im client (gegenstück aufm server) und das gleiche umgedreht.

    danach lässt du ne zeichenkette generieren. Die hashest du(zB sha256)
    und verwendest den hast als key für aes.
    nun verschlüsselst du die daten mit aes und den key dazu mit rsa. Den key sendest du mit den daten mit. Im client wird der key entschlüsselt mit dem private rsa key. Danach die daten mit aes entschlüsseln.

    das gleiche rumgedreht.
    Warum das so vorteilhaft ist: siehe google.
    Rsa allein wäre für große datenmengen zu langsam.
    aes is schnell aber wegen der keyübertragung unsicher. Als beide kombinieren

    und fertig :)
    Viele Frauen kamen, viele sind gegangen, eine ist geblieben 12.5.12 <3 ich liebe dich Schatz :love: :love:
    RSA sollte tatsächlich nur zur Schlüsselübertragung eingesetzt werden, jedoch eher für jede Session anstatt für jedes Datenpaket. Und eine Verbindung mit einem Chat-Server stellt auch so eine Session dar.
    Um da noch etwas tiefer rein zu gehen:
    Der Client brauch kein eigenes RSA Schlüsselpaar. Nicht mal annähernd. Der Client schickt nämlich das AES PAsswort (von diesem wiederum der eigentliche Key abgeleitet wird), nen Hash davon sowie den IV für diese Session - durch den public Key des Servers verschlüsselt - an den Server. Schon der Verbindungsaufbau findet sogesehen verschlüsselt statt. Der Server versucht dies dann eben wieder aufzuschlüsseln, wo es dann zwei Möglichkeiten gibt:
    1. Es kommt nur Müll dabei rüber. Verbindung trennen, alles gut.
    2. Der Hash des Keys, stimmt mit dem Hash im Datenpaket überein, also ist alles soweit in Ordnung.

    Nun wird RSA quasi weggeworfen, und AES nun als Verschlüsselung vor dem Senden benutzt.
    Alles was nun gesendet wird, geht über den selben Schlüssel, bis einer der beiden, geplant oder ungeplant, die Verbindung abbricht. Für die Nächste Verbindung gibts dann einen neuen Schlüssel.

    Und wer sichergehen will, dass auch die AES-Pakete unverändert ankommen, der sollte sich mal über HMAC informieren.

    Problem an der Sache mit dem PublicKey im Programm ist jedoch, wenn man RSA mal updaten möchte, sagen wir mal von 2048 auf 4096, muss jeder Client mit einem neuen Schlüssel versorgt werden.
    Post-AGB:
    §1 Mit dem Lesen dieses Posts stimmst du den AGB unverzüglich zu
    §2 Ein Widerruf muss innerhalb von 3 Sekunden nach Lesen des Hauptbestandteil des ersten jemals gelesenen Posts erfolgen
    Abs.1 Die Signatur zählt nicht zum Hauptbestandteil des Posts
    §3 Ein erfolgreicher Widerruf zwingt zu einem Besuch bei einem Hypnotiseur oder Neurochirurg, sodass der gelesene Text aus den Erinnerungen entfernt werden kann
    Abs.1 Die Kosten und Risiken sind jeweils selbst zu tragen
    @EaranMaleasi Also der Client sendet (per RSA) alle zufälligen AES-Werte für diese Session an den Server. Der dann mit diesen Daten eine AES-Verschlüsselung einrichtet und alles andere dann über diese versendet.

    -> Wie kriege ich jetzt die ganzen zufälligen Werte? Über den AESCryptoServiceProvider?
    -> Wie bekomme ich die RSA-Verschlüsselung mit Private und Public Key hin?
    -> Und was mache ich mit den User-Passwörtern in der Datenbank? (s. Startpost)
    Passwörter werden grundsetzlich nur gehashed und dann abgelegt.
    Beim login die eingabe hashen und abgleichen.

    ich habe sowohl für beides eine lib geschrieben bzw bin noch dabei. Du kannst sie hier runterladen(im anhang)

    Logbuch V2 Beta 2
    Viele Frauen kamen, viele sind gegangen, eine ist geblieben 12.5.12 <3 ich liebe dich Schatz :love: :love:
    Ich hab mittlerweile folgende Funktion für die AES Verschlüsselung geschrieben, leider gibt sie nichts zurück. Woran könnte das liegen?

    VB.NET-Quellcode

    1. Public Function AESEncrypt(ByVal tEncrypt As String, ByVal IV As String, ByVal Key As String) As String
    2. Dim AESCSP As New AesCryptoServiceProvider
    3. Dim AESCT As ICryptoTransform = AESCSP.CreateEncryptor(Convert.FromBase64String(Key), Convert.FromBase64String(IV))
    4. Dim MS As New MemoryStream
    5. Dim CS As New CryptoStream(MS, AESCT, CryptoStreamMode.Write)
    6. Dim SW As New StreamWriter(CS)
    7. Dim tReturnBytes() As Byte
    8. SW.Write(tEncrypt)
    9. tReturnBytes = MS.ToArray
    10. AESCSP.Dispose()
    11. Return Convert.ToBase64String(tReturnBytes)
    12. End Function
    Edit: Den CryptoStream und den StreamWriter in einen Using-Block packen und es geht. So jetzt mal schauen ob das mit dem Rest klappt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Vainamo V“ ()

    EaranMaleasi schrieb:

    dann Temporäre Paswörter zu vergeben, falls jemand seines Vergessen hat

    Ich muss da jetzt nochmal nachfragen wie das gemeint war, da mich die Frage wie ich das mache, wenn jemand sein Passwort vergessen hat, auch schon beschäftigt hat.
    Na, anstatt die ganzen Passwörter zu verschlüsseln, werden sie eben gehasht. Wenn dann jemand auf z.B. "Passwort vergessen" klickt, generierst du ein neues zufälliges Passwort, schickst das an die eingegebene E-Mail Adresse (sofern vorhanden) und legst dieses nun für den Account gehasht in der DB ab. Selbst wenn dann jemand dir die DB klaut, sind die Passwörter sicher.
    Post-AGB:
    §1 Mit dem Lesen dieses Posts stimmst du den AGB unverzüglich zu
    §2 Ein Widerruf muss innerhalb von 3 Sekunden nach Lesen des Hauptbestandteil des ersten jemals gelesenen Posts erfolgen
    Abs.1 Die Signatur zählt nicht zum Hauptbestandteil des Posts
    §3 Ein erfolgreicher Widerruf zwingt zu einem Besuch bei einem Hypnotiseur oder Neurochirurg, sodass der gelesene Text aus den Erinnerungen entfernt werden kann
    Abs.1 Die Kosten und Risiken sind jeweils selbst zu tragen

    EaranMaleasi schrieb:

    anstatt die ganzen Passwörter zu verschlüsseln, werden sie eben gehasht

    Werden sie mit SHA256.

    EaranMaleasi schrieb:

    Wenn dann jemand auf z.B. "Passwort vergessen" klickt, generierst du ein neues zufälliges Passwort

    Wie generiere ich denn ein zufälliges Passwort? Zahlen weiß ich ja, aber Strings?

    EaranMaleasi schrieb:

    schickst das an die eingegebene E-Mail Adresse

    Es ist nur ein lokaler TCP Chat. Wahrscheinlich werde ich Sicherheitsfragen einbauen, um nur der richtigen Person das temporäre Passwort auszugeben. Sonst könnte ja jeder bei jedem Account "Passwort vergessen" sagen. ^^

    @all Haltet ihr eigentlich Hmac für sinnvoll, um die Nachrichten zu validieren?
    Hmac sollte normalerweise eine Selbstverständlichkeit sein, deswgen ist hier im unteren Teil eine C# Klasse, in der das ganz "automatisch" gemacht wird.
    gist.github.com/jbtule/4336842[/url]

    Post-AGB:
    §1 Mit dem Lesen dieses Posts stimmst du den AGB unverzüglich zu
    §2 Ein Widerruf muss innerhalb von 3 Sekunden nach Lesen des Hauptbestandteil des ersten jemals gelesenen Posts erfolgen
    Abs.1 Die Signatur zählt nicht zum Hauptbestandteil des Posts
    §3 Ein erfolgreicher Widerruf zwingt zu einem Besuch bei einem Hypnotiseur oder Neurochirurg, sodass der gelesene Text aus den Erinnerungen entfernt werden kann
    Abs.1 Die Kosten und Risiken sind jeweils selbst zu tragen

    Vainamo V schrieb:

    Wie generiere ich denn ein zufälliges Passwort? Zahlen weiß ich ja, aber Strings?

    LINQ-Extensions:

    VB.NET-Quellcode

    1. Public Shared Function RandomString(length As Integer) As String
    2. Dim chars As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
    3. Dim random As New Random()
    4. Return New String(Enumerable.Repeat(chars, length).[Select](Function(s) s(random.[Next](s.Length))).ToArray())
    5. End Function


    Du kannst die Zeichen natürlich beliebig anpassen.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!: