L'application que mon équipe développe actuellement a une DLL qui est utilisée pour effectuer tous les access à la database. L'application ne peut pas utiliser une connection approuvée car la database se trouve derrière un pare-feu et le server de domaine ne l'est pas. Il semble donc que la string de connection doit avoir un nom d'user et un mot de passe DB. La DLL a actuellement la string de connection de database codée en dur, mais je ne veux pas faire cela quand nous lançons car l'assembly peut être démonté et le nom d'user et le mot de passe seraient là à l'air libre.
Une des exigences est que le mot de passe doit être changé une fois tous les quelques mois, nous devrons donc le déployer à notre base d'users interne.
Y at-il un moyen de stocker le mot de passe crypté de telle sorte que nous pouvons facilement dissortingbuer à l'set de la base d'users sans le stocker dans l'set?
MISE À JOUR: Merci à tous ceux qui ont répondu. Je vais essayer de répondre à certaines de mes questions … La DLL de données est utilisée à la fois par ASP.NET WebForms et VB.NET WinForms. Je comprends que les applications peuvent avoir leurs propres files de configuration, mais je n'ai rien vu sur les files de configuration pour les DLL. Malheureusement, je ne peux pas arriver au post de Jon Galloway au travail, donc je ne peux pas juger si cela va fonctionner. Du sharepoint vue du développement, nous ne voulons pas utiliser les services Web à l'interne, mais nous pouvons les fournir à des tiers l'année prochaine. Je ne pense pas que l'usurpation d'identité fonctionnera car nous ne pouvons pas authentifier l'user via le pare-feu. Comme un user (ou un ancien user) peut être un attaquant, nous le gardons de tout le monde!
Je ne suis pas certain, mais je crois que vous pouvez le mettre dans un file de configuration et crypter le file de configuration.
Mise à jour: Voir le message de Jon Galloway ici.
Supposons juste que les méchants vont get les informations d'identification de votre file de configuration. Cela signifie qu'ils pourraient se connecter à votre database et faire tout ce dont cet user est capable. Donc, assurez-vous que l'user ne peut rien faire de mal comme accéder directement aux tables. Rendre cet user seulement capable d'exécuter certaines procédures stockées et vous serez en meilleure forme. C'est un endroit où les sprocs brillent.
Je déteste dire cela, mais dès que vous mettez quelque chose sur un ordinateur client, la security de ces données disparaît de la window.
Si votre programme va décrypter cette string, vous devez supposer qu'un attaquant peut faire la même chose. Attacher un débogueur à votre programme serait un moyen.
Stocker la string de connection sur un server, et l'get par le biais d'une connection web, semble bien, jusqu'à ce que vous réalisiez que vous avez besoin de security sur cette connection web, sinon un attaquant pourrait aussi bien usurper votre programme et parler à la connection web.
Laissez-moi poser une question. De qui cachez-vous la string de connection? L'user ou un attaquant? Et si l'user, pourquoi?
Il y a aussi une autre idée. Vous pouvez toujours utiliser l'usurpation d'identité. En outre, vous pouvez utiliser la bibliothèque d'entreprise (bibliothèque commune).
<section name="enterpriseLibrary.ConfigurationSource" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ConfigurationSourceSection, Microsoft.Practices.EnterpriseLibrary.Common, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <enterpriseLibrary.ConfigurationSource selectedSource="Common"> <sources> <add name="Common" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.FileConfigurationSource, Microsoft.Practices.EnterpriseLibrary.Common, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" filePath="Config\Exception.config" /> </sources>
.NET prend en charge le encryption sur les valeurs de configuration comme celle-ci. Vous pouvez le laisser dans un file de configuration, mais crypté.
Vous voulez pouvoir dissortingbuer la DLL avec toutes les informations de configuration dans un location configurable, mais le fait est que vous ne pouvez pas avoir l'un des files de configuration .NET à scope de main pour une DLL, sauf si vous faites quelque chose de personnalisé.
Peut-être que vous devez repenser la responsabilité de votre DLL. Serait-il possible ou logique d'exiger que la string de connection soit transmise par l'user de votre bibliothèque? Est-il vraiment logique que votre DLL lit un file de configuration?
Si l'application est une application ASP.NET, cryptez simplement la section des strings de connection de votre web.config
.
Si l'application est une application client s'exécutant sur plusieurs machines, au lieu de stocker localement la string de connection, pensez à utiliser un service Web ou un autre type de mécanisme sécurisé pour le stocker de manière centralisée. Cela facilitera les mises à jour plus faciles dans le futur et vous ne stockez pas la string de connection localement.
Juste quelques pensées.
Mis à jour: @ lassevk
«Stocker la string de connection sur un server et l'get via une connection Web est satisfaisant, jusqu'à ce que vous réalisiez que vous avez également besoin de security sur cette connection Web, sinon un attaquant pourrait tout aussi bien emprunter votre programme et parler à la connection Web. "
La security sur le service Web était implicite. Selon le type de deployment, il existe de nombreuses options … par exemple des certificates côté client.
Plusieurs options: