IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

stockage sécurisé d'une chaine de connexion en .net


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut stockage sécurisé d'une chaine de connexion en .net
    bonjour

    question qui me turlupine depuis des années
    attention aux réponses trop rapides, j'ai déjà des arguments prouvant que ca ne marcherait pas

    question : où mettre et comment accéder à ma chaine de connexion

    informations :
    - .exe (windows forms ou wpf)
    - base de données avec connexion par login/mot de passe
    - login/mot définis par le développeur

    parce que mettre la chaine de connexion dans un string forcément via reflector on la retrouve
    mettre le tout dans un fichier crypté et décrypter au démarrage du programme c'est pas bon non plus, l'algo de décryptage peut etre retrouvé via reflector

    le débat est ouvert, est-ce possible de sécuriser une donnée en .net ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  2. #2
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Dynamiquement, en tous cas, il existe la classe SecureString. Mais ça te dit pas comment l'entreposer...

    Je suppose que t'as jeté un oeil ici aussi ?

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Par défaut
    Salut,

    Il existe un mécanisme natif de protection des fichiers de config via DPAPI. Les sections peuvent ainsi être cryptées en faisant appel aux services de crypto de l'OS.

    Je te propose ce lien ou encore celui-ci pour voir le résultat.

    (j'espère ne pas avoir répondu trop rapidement)

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    je vois pas trop comment mettre en place les solutions

    genre le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    protected override void OnStartup(StartupEventArgs e) 
    { 
        // Lots of other important stuff here... 
        EncryptConfigSection("userSettings/Witty.Properties.Settings"); 
        base.OnStartup(e); 
    }
     
    private void EncryptConfigSection(string sectionKey)
    {
        Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        ConfigurationSection section = config.GetSection(sectionKey);
        if (section != null)
        {
            if (!section.SectionInformation.IsProtected)
            {
                if (!section.ElementInformation.IsLocked)
                {
                    section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
                    section.SectionInformation.ForceSave = true;
                    config.Save(ConfigurationSaveMode.Full);
                }
            }
        }
    }
    qui crypte le fichier .config, je le met où ?

    et puis si dans mon code vb.net y a le code qui obtient le mot de passe, ce code peut etre copié dans un autre projet pour décrypter le .config, non ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Dans le lien que je t'ai filé, la protection ne vient pas du programme lui-même, mais du fait qu'il faut s'identifier comme quelqu'un ayant les droits sur le fichier contenant la clé de décryptage.

    je cite :
    The user account or identity under which ASP.NET runs must have read access to the encryption key used to encrypt and decrypt sections of the Web.config file.

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    sauf que je n'utilise pas asp.net
    et que le programme doit etre déployé sur plusieurs pcs
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    je vois pas trop comment mettre en place les solutions

    genre le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    protected override void OnStartup(StartupEventArgs e) 
    { 
        // Lots of other important stuff here... 
        EncryptConfigSection("userSettings/Witty.Properties.Settings"); 
        base.OnStartup(e); 
    }
     
    private void EncryptConfigSection(string sectionKey)
    {
        Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        ConfigurationSection section = config.GetSection(sectionKey);
        if (section != null)
        {
            if (!section.SectionInformation.IsProtected)
            {
                if (!section.ElementInformation.IsLocked)
                {
                    section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
                    section.SectionInformation.ForceSave = true;
                    config.Save(ConfigurationSaveMode.Full);
                }
            }
        }
    }qui crypte le fichier .config, je le met où ?

    et puis si dans mon code vb.net y a le code qui obtient le mot de passe, ce code peut etre copié dans un autre projet pour décrypter le .config, non ?
    en réalité, ce qu'il faut comprendre c'est que l'on peut crypter le fichier le de config. Ce cryptage est lié aux jetons des clés publiques et privées de chaque machine. Il est n'est pas possible de crypter une section avant publication. Plusieurs méthodes sont possibles : action post déploiement, au démarrage de l'application, ...
    L'exemple est en WPF, mais c'est utilisable aussi en ASPNET et Winforms.

  8. #8
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    bon bah c'est dommage mais je ne comprends aucun des liens ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 8
    Par défaut
    Bonjour,

    Désolé de déterrer ce post, mais je trouve la question de pol63 très intéressante et, travaillant sur le sujet en ce moment, je pense que les solutions apportés ne sont pas suffisante.

    Je m’explique :
    La solution du cryptage du fichier de configuration est, bien entendu, la technique qui parait la plus sur et la plus pertinente. (C’est d’ailleurs celle que j’utilisais jusqu'à aujourd’hui)

    Malheureusement, en approfondissant un peut, je me suis aperçu qu’il y avait une énorme faille de sécurité avec cette technique.

    La section du fichier de configuration est cryptée à l’aide de clés de chiffrements mise à disposition, au mieux, qu’à un seul utilisateur ou à une seule machine.
    Par ce fait, un utilisateur (développeur) mal intentionné, pourrait très facilement accéder aux informations cryptées.

    Je prends comme exemple une chaine de connexion :
    Le développeur voulant sécuriser cette chaine afin qu’aucune personne ne puisse accéder au mot de passe de connexion utilisera le code proposé par cybermaxs lors de l’installation de son application pour crypter la section connectionStrings.

    Le développeur mal intentionné n’aura cas :
    1) Installer l’application en question
    2) Développer une bête application qui liste les chaine de connexion de son propre fichier de configuration (ConfigurationManager.ConnectionStrings)
    3) Il n’a pu qu’a faire un copier coller de la section connectionStrings du fichier de configuration crypté dans son fichier de configuration et a lancer son application (Etant donné qu’il a installé l’appli protégée, il a donc accès au conteneur des clés de chiffrement et pourra donc afficher l’information cryptés sans problème)

    Je relance ce poste pour avoir votre avis sur le sujet.

    Pensez-vous qu’il soit possible de limiter le décryptage à un seul assembly ?

  10. #10
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Par défaut
    A mon avis on a beau retourné le problème dans tous les sens on arrivera au mieux à compliquer la tâche de récupération de la chaîne de connexion.

    Au final le programme doit à un moment ou a un autre décrypter cette information pour être utilisé sur une machine distante (Qui n'est pas sécurisable par définition, vu qu'a priori on a pas le contrôle dessus). L'utilisateur malveillant aura forcément un moyen de retrouver l'information en question (la difficulté peut tendre vers l'infini mais c'est jamais impossible).

    Maintenant on se pose les questions suivante:

    A quoi sert ma chaîne de connexion?

    A se connecter à une base de donnée afin de réaliser un certain nombre d'opération sur les données contenue dans la base en question.

    Pourquoi je ne veux pas afficher ma chaîne de connexion?

    Afin d'éviter que l'utilisateur puisse accéder à mes données en évitant les traitements de mon application. (Et y réaliser des opérations non autorisée à l'aide d'une tierce application)

    (Au final je m'en contre fou que l'utilisateur veut supprimer une fiche produit sur mon serveur SQL avec entreprise manager plutôt qu'à l'aide de mon programme)

    Il faut donc que la sécurité et l'intégrité des données soient gérée par la base de donnée et non par l'application. A l'aide de comptes utilisateurs aux droits restreint et par l'utilisation de procédure stockée (à la place de requête UPDATE & Cie).

    Le cryptage de cette chaine de connexion est à mon avis une fausse bataille!!!

    C'est un peu le même principe que pour une application web. On réaliser les traitement et les tests sur le serveur et non en javascript dans le navigateur!

  11. #11
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Pensez-vous qu’il soit possible de limiter le décryptage à un seul assembly ?
    Pour mes appli qui ne demandent qu'un niveau de sécurité pas trop élevé,
    il y a dans le source une clé de cryptage propre à l'appli.

    L'utilisateur a une interface permettant de saisir le mot de passe (ou la chaine de connexion) : l'appli l'encode avec la clé de cryptage et l'enregistre en hexa dans un fichier texte.

    Pour établir une connexion, l'appli lit le mot de passe (ou la chaine de connexion) cryptée et la décrypte.

    Il est bien sur possible de retouver la clé de cryptage en désassemblant le code de l'exe et en introduisant une trace lors de l'établissement de la connexion.
    Pourquoi je ne veux pas afficher ma chaîne de connexion?
    Afin d'éviter que l'utilisateur puisse accéder à mes données en évitant les traitements de mon application. (Et y réaliser des opérations non autorisée à l'aide d'une tierce application)
    Ou par exemple que cette chaine puisse être utilisée par un Batch qui sera lancé chaque nuit, sans toutefois figurer en clair dans un fichier de config ou la base de registre.

  12. #12
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 8
    Par défaut
    Citation Envoyé par sinople Voir le message
    Il faut donc que la sécurité et l'intégrité des données soient gérée par la base de donnée et non par l'application. A l'aide de comptes utilisateurs aux droits restreint et par l'utilisation de procédure stockée (à la place de requête UPDATE & Cie).

    Le cryptage de cette chaine de connexion est à mon avis une fausse bataille!!!
    Tout à fait d’accord avec toi. Le seul et unique moyen de sécuriser totalement sa base de données est de placer toute la sécurité au niveau de cette dernière.

    Dans le cas d’SQL Server, cela permet même d’éliminer le mot de passe de la chaine de connexion en utilisant la sécurité des comptes utilisateur windows.

    Mais bien entendu, le travail à faire au niveau de la base est bien plus gros lorsque l’utilisateur n’a accès qu’à certaines informations d’une tables par exemple (création de vues, procédures stockées et autres …). Mais je pense au final que c’est un mal pour un bien.

    Malheureusement il réside un dernier petit point noir. Le cas ou on vous demande de développer une application qui devra s’interfacer sur une base de données existante sur laquelle vous n’avez aucun pouvoir de modification (étant donné qu’elle est probablement déjà en production) et pour laquelle on vous fournira uniquement une chaine de connexion avec, bien entendue, le mot de passe dans la chaine (mot de passe que l’utilisateur doit, bien entendue, ne pas connaître).

    Je sais, je pousse le bouchon un peut loin, mais ca peut arriver. Je pense que dans ce cas la seule solution de secours est de placer la chaine dans le code de l’application et d’effectuer une obfuscation du code (Obfusquer = rendre le code illisible au décompileur ou lors de la réflexion).

    Citation Envoyé par Graffito Voir le message
    il y a dans le source une clé de cryptage propre à l'appli.
    Désolé Graffito, mais c’est la ou le chien se mort la queue =D. Au final on a toujours une clé quelque part. Et comme tu l’as dit, elle peut être visible à la décompilation.

  13. #13
    Membre confirmé
    Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2007
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 99
    Par défaut
    Ce sujet est assez proche de la problématique du logiciel de sécurisation HadoUsineAGaz :
    http://www.freenews.fr/spip.php?article8655

    Le sujet de comment avoir des informations intelligible dans une assembly .NET et indéchiffrable ailleurs est intéressant.

    Malheureusement, j'ai peur que la réponse "idéal" n'existe pas.

  14. #14
    Invité de passage
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1
    Par défaut
    Bonjour,

    J'ai pu crypté mon fichier web.config, mais mon problème mtn c'est que j'arrive pas à accéder mon application, la chaîne de connexion n'est pas reconnu vu qu'elle est crypté..

    Est ce que vous avez des idées ?

Discussions similaires

  1. Définition d'une chaine de connexion
    Par maniravitch dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 28/02/2008, 11h52
  2. [D7] Paramètrer une chaine de connexion
    Par EMC51 dans le forum Delphi
    Réponses: 1
    Dernier message: 15/11/2006, 15h32
  3. Réponses: 4
    Dernier message: 20/10/2006, 17h19
  4. Réponses: 1
    Dernier message: 21/07/2006, 13h36
  5. [VB.Net 2.0/xsd] Comment passer une chaine de connexion dynamiquement ?
    Par graphicsxp dans le forum Accès aux données
    Réponses: 4
    Dernier message: 21/07/2006, 12h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo