2009-10-16 8 views
0

Mon application Web asp.net lit et décrypte le mot de passe d'un fichier XML dans l'événement App_start de Global.asax. Mais où dois-je stocker ce mot de passe après? Serait-il suffisant de simplement le stocker dans une variable publique statique ou plutôt l'objet d'application?Où stocker le mot de passe en cours d'exécution?

EDIT: Son mot de passe de la base de données

+1

Quel est le but de ce mot de passe, en avez-vous besoin en texte clair? –

+0

Son un mot de passe de base de données – user137348

+0

Comment interagissez-vous avec votre base de données? ADO.NET? LINQ? –

Répondre

6

Si cela vous inquiète, utilisez un SecureString dans l'objet Application. Cependant, je me sens obligé de vous avertir que les mots de passe cryptés dans les fichiers de configuration sont un cauchemar de maintenance. Vous devriez vraiment reconsidérer le stocker en texte brut dans le web.config et en refusant simplement l'accès au fichier web.config pour tous les administrateurs sauf sysadmins et l'utilisateur du processus de travail asp.net (probablement NETWORK SERVICE)

+0

qu'en est-il d'une propriété publique statique? – user137348

+0

Oui, ce serait évidemment mieux. Je ne me rappelle pas ce qui m'a incité à recommander l'utilisation de l'objet application - je pense que je l'ai lu dans un autre commentaire ou réponse, ou quelque chose. :-) – Chris

1

Pourquoi avez-vous besoin du mot de passe pendant toute la session? Créez un cookie ou une valeur de session et définissez un indicateur lorsque l'utilisateur se connecte. Vous pouvez ensuite utiliser cette valeur pour vérifier si l'utilisateur est connecté.

+0

+1 Pour les cookies :-) – bastianneu

+0

Son un mot de passe de base de données – user137348

+0

Bon alors ... pas de cookies! – bastianneu

5

Stockez-le dans l'objet Application. Comme vous le faites dans l'événement Application_Start en Global.asax, il sera disponible pour l'ensemble de votre application lorsque vous en aurez besoin. En outre, en les stockant dans l'objet Application, vous n'êtes pas l'exposer à côté client en utilisant des cookies, viewstate, etc.

// set it 
Application["MyPassword"] = myDecryptedPassword; 

Et pour le récupérer ailleurs dans votre application:

// get it 
string myDecryptedPassword = Application["MyPassword"].ToString(); 
+0

qu'en est-il d'une propriété statique publique? – user137348

0

Pourquoi est-il nécessaire d'inclure le mot de passe? Est-il impossible de le stocker en texte brut dans une chaîne de connexion dans le fichier web.config?

0

Vous pouvez stocker le mot de passe dans l'objet Application.

Toutefois, ma préférence personnelle consiste à ajouter une propriété statique publique à la classe Global pour accéder aux données au niveau de l'application. Cela vous donnera un support Intellisense, vous donnera une sécurité de type (vous pouvez "accidentellement" écraser votre mot de passe dans l'objet Application avec des données d'un autre type, par exemple), et rendra plus facile la maintenance de votre application plus tard.

0

SecureString est ce que vous cherchez. N'utilisez jamais un simple objet chaîne car il n'est pas crypté et peut survivre à différentes collectes, ce qui signifie que votre mot de passe volera dans toute la mémoire pendant une longue période et que vous ne pourrez pas le contrôler à moins d'assigner dynamiquement GB Génération qui peut être assez diabolique. SecureString, à la place, est automatiquement supprimé lorsqu'il n'est plus utilisé.

D'autre part, lors du stockage d'un mot de passe dans le web.config toujours le crypter. Vous pouvez utiliser aspnet_regiis.exe pour cela. (Il fait partie des outils .NET Framework). Donc, en supposant que vous stockez le mot de passe dans un élément xml appelé "DBAccessPassword" La commande de cryptage ressemblerait à quelque chose comme ceci.

aspnet_regiis.exe -pe "DBAccessPassword" -app "/yourApp" 

C'est une technique très utile qui pourrait vraiment fait la différence si, par exemple, votre application est vulnérable à un Path Traversal Vulnerability. Le cryptage d'un mot de passe est toujours une bonne idée car il ajoute une couche de sécurité supplémentaire à votre application.

Performances

aspnet_regiis utilise RSA par défaut. RSA c'est un algorithme asymétrique et à cause de cela, en fonction du temps que vous récupérez votre mot de passe, cela pourrait conduire à un problème de performances. Les algorithmes à clé symétrique sont généralement beaucoup moins computationnels que les algorithmes à clé asymétrique. En pratique, les algorithmes de clés asymétriques sont typiquement des centaines à des milliers de fois plus lents que les algorithmes à clé symétrique. En fonction du type de votre application, vous pouvez également envisager d'utiliser un autre algorithme.

Questions connexes