ASP.Net MVC- und WebAPI-Verschlüsselung

8

Ich möchte eine Form der "einfachen" Verschlüsselung verwenden, die einigermaßen sicher ist, aber sehr geringe Auswirkungen auf den Entwicklungsprozess hat.

Angenommen, ich besitze beide Seiten der Konversation in einem Client & lt; & gt; Web-Service-Situation. Meine Anwendung ist eine Windows Phone / Win8 / Silverlight / Desktop-App und der Server ist ASP.Net MVC oder WebAPI.

In meiner Vorstellung möchte ich etwas so einfaches wie: -

%Vor%

als eine Form von Konfigurationsparametern auf dem Client und dem Server. Außerdem wird eine Authentifizierungsroutine zurückgegeben und speichert eine Form des öffentlichen Schlüssels.

Dadurch wird der "Verschlüsselungsmodus" aktiviert und alle HTTP-Anfragen werden verschlüsselt. in der ausgewählten Weise mit den bereitgestellten Schlüsseln hashed. Das Endergebnis besteht darin, dass alles, was auf den lokalen, Proxy- oder Remote-Computern gefunden wurde, die Daten nicht ohne den Schlüssel und die Entschlüsselungsmethode anzeigen kann. Auf dem Server werden die Daten mit dem gleichen Schlüssel entschlüsselt, bevor Controller-Aktionen ausgeführt werden.

Abgesehen vom Austauschen von HttpRequest / WebClient wird etwas wie EncryptedHttpRequest aufgerufen und der entsprechende Hook auf der MVC / WebAPI-Seite hinzugefügt. Alle anderen Client-Code- und Controller-Aktionen wären unwissend dafür, dass die Daten verschlüsselt waren.

>

Fehle ich etwas oder könnte Setup nicht so einfach sein? Soweit ich gesucht habe, gibt es nichts, was diese Einfachheit bietet, also denke ich, dass mir ein klaffender Fehler in meiner Logik fehlt?

    
DannyT 15.08.2012, 19:30
quelle

2 Antworten

8

Ich habe das erfolgreich gemacht. Es ist nicht zu schwierig und funktioniert gut. Ich benutze es um eine Lizenz für ein Produkt zu aktivieren. Das Wichtigste ist, dass Sie wirklich den Client und den Server kontrollieren - niemand kann Ihren privaten Schlüssel aus Ihrem Code auf dem Client extrahieren.

Schritt 1: Erstellen Sie eine MVC-Controller-Aktionsmethode, die keine Argumente annimmt:

%Vor%

Schritt 2: Verwenden Sie im Controller einfach den HttpRequest.InputStream, um die vom Client gesendeten Bytes zu erhalten.

var stream = this.HttpContext.Request.InputStream;

Schritt 3: Erstellen Sie einen CryptoStream für die Deserialisierung.

Ich habe hier Beispiele für die Verschlüsselung und Entschlüsselung aufgenommen. Das sharedSecret ist ein Byte [] mit ausreichender Länge (512 Bytes) von zufälligen Bytes - das ist was Sie schützen!

%Vor%

Schritt 4: Verwenden Sie Ihren CryptoStream anderen Stream-Reader zum Entschlüsseln.

Ich benutze einen XmlReader, damit mein existierender Serialisierungscode entweder im Klartext (beim Lesen / Schreiben auf Platte oder Datenbank auf dem Server) oder verschlüsselt (beim Übertragen) funktionieren kann.

%Vor%

Schritt 5: Formulieren Sie eine sichere Antwort in Ihrem Controller.

Dies geschieht in umgekehrter Reihenfolge der Schritte 1-4, um Ihr Antwortobjekt zu verschlüsseln. Dann schreiben Sie Ihre verschlüsselte Antwort einfach in einen Speicherstream und geben sie als Dateiergebnis zurück. Im Folgenden habe ich gezeigt, wie ich dies für mein Lizenzantwortobjekt tue.

%Vor%

Schritt 6: Implementieren Sie Ihre Clientanforderungsantwort.

Sie können HttpWebRequest oder die WebClient-Klassen verwenden, um die Anforderung zu formulieren. Hier sind ein paar Beispiele aus dem Code, den ich verwende.

%Vor%

Zusammenfassung und Tipps

  • Verwenden Sie die Streams in der Anfrage / Antwort auf dem Client und Server, um binäre Oktettstream-Daten zu kommunizieren
  • Verwenden Sie CryptoStream zusammen mit einem Verschlüsselungsalgorithmus (verwenden Sie möglicherweise die stärkste Verschlüsselungspossilbe) und einen guten privaten Schlüssel, um Daten zu verschlüsseln, wenn Sie sie serialisieren / deserialisieren.
  • Überprüfen Sie die Größe und formatieren Sie alle eingehenden Daten für den Client und den Server (vermeiden Sie Pufferüberläufe und werfen Sie Ausnahmen früh ab)
  • Schützen Sie Ihren privaten Schlüssel auf Ihrem Client, wenn möglich, durch Verschleierung (schauen Sie sich den DeepSea-Obfustactor an)
Geoff Cox 16.08.2012, 17:43
quelle
18

Alles, was Sie suchen, können Sie einfach mit HTTPS erreichen. Kaufen Sie einfach ein Zertifikat (oder verwenden Sie ein selbstsigniertes Zertifikat) und es gibt Ihre Verschlüsselung.

Erfinde das Rad nicht neu.

    
Aliostad 16.08.2012 11:23
quelle