2015-09-24 2 views
8

Die msdn documentation auf PasswordBox.Password sagt:Wird das Kennwort nicht mit der PasswordBox.Password-Eigenschaft angegeben?

Wenn Sie den Password-Eigenschaft Wert zu erhalten, können Sie das Passwort im Klartext im Speicher aus. Um dieses potenzielle Sicherheitsrisiko zu vermeiden, verwenden Sie die SecurePassword-Eigenschaft, um das Kennwort als SecureString abzurufen. So

Ich sende SecurePassword meiner Ansicht Modell auf PasswordChanged Ereignis, alles sicher zu sein erwartet, aber wenn ich meine Bewerbung mit Snoop inspizieren, in PasswordBox der Password Eigenschaft sehe ich das Passwort Ich im Klartext eingegeben. Wird damit der ganze Zweck der Verwendung von SecurePassword nicht zunichte gemacht? Gibt es noch etwas, was ich hier tun sollte, um die Passwörter zu schützen?

+0

Also, welche Eigenschaft Ihrer 'PasswordBox' binden Sie an das Ansichtsmodell? – torvin

+0

@torvin: \t Ich bin nicht an PasswordBox binden. Es hat keine bindbaren Passworteigenschaften aufgrund von Sicherheitsbedenken, also behandle ich, wie gesagt, das PasswordChanged-Ereignis in Code-Behind. Ich habe den DataContext einfach in meinen View-Modelltyp umgewandelt und seine Passwort-Eigenschaft aktualisiert. – Andikki

+0

Sie sollten Ihre 'PasswordBox.SecurePassword'-Eigenschaft an eine Eigenschaft vom Typ' SecureString 'im Ansichtsmodell binden. Auf diese Weise ist es sicher gegen Speicher-Scans (wozu 'SecureString' gehört). – torvin

Antwort

5

Das ist meine bescheidene Meinung.

Snoop injiziert seinen Code in laufende Anwendung. Also, es ist im Grunde ein Hacker-Tool. Ein sehr einfach zu bedienendes Hacker-Tool, das nur mit Ihrer GUI funktioniert. Dies ist der Grund, warum das Ändern der Sichtbarkeit eines Elements zum Verbergen von Daten vom Benutzer eine schlechte Sicherheitsabfrage ist. Alles über Einschränkungen, Zugriff und Sicherheit sollte nicht auf der UI-Ebene behandelt werden. Es gibt Möglichkeiten auf How to Snoop proof your wpf application?, aber Hauptpunkt der Antworten dort ist, dass Sie Ihre Anwendung in der Weise entwerfen müssen, die es Snoop nicht erlaubt, irgendetwas zu verletzen. Validieren Sie zum Beispiel alles auf dem Server.

Zurück zu Ihrer Frage:

Es gibt zwei Szenarien. Die erste ist: Benutzer erstellt ein Passwort. Ich glaube, dies ist kein Problem, wenn die Malware eines Benutzers oder Benutzers das Kennwort in diesem Moment sehen wird. Dann erhalten und speichern Sie eine gesicherte Zeichenfolge. Und das Passwort des Benutzers löschen.

Zweites Szenario: Sie zeigen dem Benutzer ein gespeichertes Passwort an. Der Trick ist - Sie zeigen es nicht an. Sie kennen die Länge eines Passworts, so dass Sie nur das deaktivierte Textfeld mit **** anzeigen können. Und wenn ein Benutzer ein Passwort ändern möchte - geben Sie ihm aktuelle Passwortboxen, die er mit alten Passwort und neuen zu füllen hat und wir sind zurück zu Szenario # 1.

Der Silberstreif am Horizont ist:

Wenn ein Benutzer ein Passwort eingibt, es ist keine große Sache ist, dass es im Klartext irgendwo in einem Speicher liegt, da ein Benutzer weiß, was he've getippt und Malware können verfolgen Tasten gedrückt.

Nachdem Sie das Passwort gespeichert Sie nie es Benutzer geben zurück


Update: Dies ist ein Quellcode für Password-Eigenschaft eines Passwort-Box

public string Password 
     { 
      [SecurityCritical] 
      get 
      { 
       string password; 

       using (SecureString securePassword = this.SecurePassword) 
       { 
        IntPtr ptr = System.Runtime.InteropServices.Marshal.SecureStringToBSTR(securePassword); 

        try 
        { 
         unsafe 
         { 
          password = new string((char*)ptr); 
         } 
        } 
        finally 
        { 
         System.Runtime.InteropServices.Marshal.ZeroFreeBSTR(ptr); 
        } 
       } 

       return password; 
      } 

Also, ich denke, was MSDN sagt, ist, dass, wenn Sie auf Password-Eigenschaft zugreifen, durch Aufruf in Code (oder Anzeigen in VS während des Debuggens, oder es Snoop anzuzeigen) rufen Sie es Get-Methode wh Ich entziffere SecuredString zu Klartext, was es dem Speicher aussetzt. Wenn Sie die Password-Eigenschaft nicht aufrufen und sie nicht durch Überprüfung in Softwaretools aufrufen, wird das Kennwort nicht im Klartext im Speicher angezeigt.

+0

Bedeutet dies, dass das Snooping des visuellen Baums oder das Abfangen von Tastenanschlägen für Malware viel schwieriger ist als das Ausspähen der Passwortzeichenfolge aus dem Speicher? – Andikki

+1

@Andikki, ich bin kein Experte in der Entwicklung von Malware, aber etwas über Wörter, die als viel schwieriger angesehen werden, verwirrt mich. In PasswordBox MS wurde das Passwort im Speicher als einfacher Text gespeichert, es sei denn, Sie oder jemand anderes ruft seine Password-Eigenschaft auf. Hätten sie es mehr schützen können? Sollten sie haben? – netaholic

+0

Ich weiß nicht viel über Sicherheit, also müssen meine Fragen naiv sein. Dennoch möchte ich sicherstellen, dass ich ein solches gemeinsames Element wie das Autorisierungsformular richtig implementiere. Versuchen Sie zu verstehen, warum Sie Vorkehrungen treffen sollten, um Ihr Passwort nicht in den Speicher zu legen, und gleichzeitig nicht daran interessiert sein sollten, eine barrierefreie Eigenschaft zu haben. Ich kann mir eine Situation vorstellen, in der ein Benutzer einen Speicher-Snapshot zur Unterstützung sendet, ohne zu merken, dass er sein Passwort verliert. Schützen wir uns hier vor solchen Dingen? – Andikki