2009-07-31 4 views
8

J'ai un peu de code qui doit fonctionner avec des privilèges élevés (plus que je veux que le reste de mon code fonctionne).Les moyens de mettre un mot de passe dans le code

J'ai mon code qui configure l'Usurpation d'identité, mais il nécessite un nom d'utilisateur, un domaine et un mot de passe. Comme mon code est en C# .net, je sais que le mot de passe peut être trouvé par quelqu'un de suffisamment déterminé.

Existe-t-il un moyen de chiffrer le mot de passe dans mon code? Ou sinon sécuriser ce mot de passe et être toujours en mesure de le transmettre?

Voici le code que je vous appelle:

using (new Impersonator("UserNameGoesHere", "DomainNameGoesGere", "Password Goes Here")) 
{ 
    uint output; 
    NetUserAdd(AUTHENTICATION_SERVER, 1, ref userinfo, out output); 
    return output; 
} 

J'aimerais un exemple qui montre comment résoudre ce problème pour ne pas montrer mon mot de passe en texte clair.

J'utilise Visual Studio 2008, .NET 3.5 SP1, et fonctionnant sous Windows Server 2003.

+0

Merci pour toutes les bonnes réponses! Je vais les essayer et choisir celui qui fonctionne le mieux. Merci encore! – Vaccano

Répondre

4

Vaccano,

Je recommande enquêter sur l'API de protection des données (DPAPI) pour ce que vous essayez d'atteindre. Il est considéré comme faisant partie de la solution dans de nombreuses approches de meilleures pratiques pour stocker de manière réversible les mots de passe nécessaires aux applications.

Un bon article discuter de la DPAPI (et d'autres techniques + préoccupations) se trouve ici:

http://msdn.microsoft.com/en-us/magazine/cc164054.aspx

Avec C# 2.0, est même pas nécessaire P/Invoquer; wrappers gérés existent:

http://blogs.freshlogicstudios.com/Posts/View.aspx?Id=41ca5a99-ddc0-4d0a-9919-2ce10bf50c7e

J'espère que cela aide!

+1

Jon Galloway a quelques exemples de mise en œuvre de ce ... http://weblogs.asp.net/jgalloway/archive/2008/04/13/encrypting-passwords-in-a-net-app-config-file.aspx – MyItchyChin

4

Vous avez plusieurs options ici.

  1. Vous pouvez hacher le mot de passe la première fois et stocker le hachage dans un fichier. Maintenant, la prochaine fois, vous voulez exécuter le code avec des privilèges élevés, vous devez accepter/retaper le mot de passe et recalculer le hachage et le faire correspondre avec le hachage stocké. Seulement si cela correspond, vous exécuterez votre code en mode d'élévation. Vous pouvez hash en utilisant SHA. S'il vous plaît regarder l'espace de noms System.Crytography pour des exemples sur le hachage.

  2. La deuxième option consiste à chiffrer le mot de passe en utilisant des algorithmes tels que AES. Cependant, vous devrez avoir une clé pour le faire et vous devrez vous inquiéter de la sécurisation de cette clé.

  3. La troisième option consiste à utiliser DPAPI et à crypter le mot de passe, mais ne vous inquiétez pas de la sécurisation des clés - option beaucoup plus facile que 2.

Je recommanderais 1 si cela ne vous dérange pas de ressaisir le mot de passe chaque fois que l'application démarre. Si ce n'est pas une possibilité, je suggère d'aller avec 3 et utiliser DPAPI.

Voici quelques liens pour vous aider à démarrer.

1. http://www.obviex.com/samples/dpapi.aspx 2. http://www.obviex.com/samples/Encryption.aspx

+0

La suggestion de hachage du mot de passe ne parvient pas à prendre l'arc en ciel attaque de table en compte. Le mot de passe doit être "salé" avant d'être haché. Voir http://www.codinghorror.com/blog/archives/000949.html –

2

Vous pouvez utiliser safe-config package NuGet. En interne, il utilise api de protection des données pour crypter et décrypter les données.

//Save some configuration data at folder data\temp\ 
var configManager = new ConfigManager() 
    .WithOptions(DataProtectionScope.CurrentUser) 
    .Set("password", "my-massword") 
    .AtFolder(@"data\temp\") 
    .Save(); 

    ... 

//Load configuration data 
var loadedValue = new ConfigManager() 
    .AtFolder(@"data\temp\") 
    .Load() 
    .Get<string>("password"); 
Questions connexes