Ich habe ein Programm, das System.DirectoryServices.AccountManagement.PrincipalContext
verwendet, um zu überprüfen, ob die Informationen, die ein Benutzer in einem Einrichtungsbildschirm eingegeben hat, ein gültiger Benutzer in der Domäne sind (der Computer selbst ist nicht auf der Domäne) und führen einige Operationen für die Benutzer der Domäne aus. Das Problem ist, dass der Benutzer nicht jedes Mal, wenn er das Programm ausführt, sein Kennwort eingeben muss, damit ich es speichern kann, aber ich fühle mich nicht wohl dabei, das Kennwort als Nur-Text in der Datei app.config zu speichern. PrincipalContext benötigt ein Klartext-Passwort, so dass ich keinen gesalzenen Hash machen kann, wie es von allen zum Speichern von Passwörtern empfohlen wird.Was kann ich tun, wenn Sie ein Kennwort nicht als Hash speichern können?
Dies ist, was ich tat
const byte[] mySalt = //It's a secret to everybody.
[global::System.Configuration.UserScopedSettingAttribute()]
public global::System.Net.NetworkCredential ServerLogin
{
get
{
var tmp = ((global::System.Net.NetworkCredential)(this["ServerLogin"]));
if(tmp != null)
tmp.Password = new System.Text.ASCIIEncoding().GetString(ProtectedData.Unprotect(Convert.FromBase64String(tmp.Password), mySalt, DataProtectionScope.CurrentUser));
return tmp;
}
set
{
var tmp = value;
tmp.Password = Convert.ToBase64String(ProtectedData.Protect(new System.Text.ASCIIEncoding().GetBytes(tmp.Password), mySalt, DataProtectionScope.CurrentUser));
this["ServerLogin"] = value;
}
}
War dies das Richtige zu tun oder gibt es einen besseren Weg?
EDIT - Hier ist eine aktualisierte Version basierend auf jedem Vorschlag
private MD5 md5 = MD5.Create();
[global::System.Configuration.UserScopedSettingAttribute()]
public global::System.Net.NetworkCredential ServerLogin
{
get
{
var tmp = ((global::System.Net.NetworkCredential)(this["ServerLogin"]));
if(tmp != null)
tmp.Password = System.Text.Encoding.UTF8.GetString(ProtectedData.Unprotect(Convert.FromBase64String(tmp.Password), md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(tmp.UserName.ToUpper())), DataProtectionScope.CurrentUser));
return tmp;
}
set
{
var tmp = value;
tmp.Password = Convert.ToBase64String(ProtectedData.Protect(System.Text.Encoding.UTF8.GetBytes(tmp.Password), md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(tmp.UserName.ToUpper())), DataProtectionScope.CurrentUser));
this["ServerLogin"] = tmp;
}
}
Wer und was Sie von Passwort zu verteidigen versuchen? – SLaks
Ich würde sagen, "richtige" Art und Weise würde das Kerberos-Ticket behalten, aber ich weiß nicht, wie in diesem Zusammenhang, sorry. – ziya
@Slaks - Ich verteidige das Passwort von gelangweilten Kollegen, die sich an den Computer eines anderen gesetzt haben. Ich möchte mich nur vor dem zufälligen Beobachter schützen, nicht vor einem entschlossenen Hacker. –