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.
Also, welche Eigenschaft Ihrer 'PasswordBox' binden Sie an das Ansichtsmodell? – torvin
@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
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