none
ASP.Net MVC 4 - Cryptage des mots de passe dans la bdd RRS feed

  • Question

  • Bonjour,

    Je développe un petit site web en utilisant ASP.NET MVC 4 et son système d'authentification par défaut. Un utilisateur peut s'enregistrer, pas de souci. Son mot de passe est bien crypté dans la table webpages_Membership.

    Je voudrai pouvoir injecter plusieurs centaines d'utilisateurs dans les tables et leur attribuer un mot de passe défini. Or celui-ci doit être crypté. Y-a-t-il un moyen de les crypter manuellement?

    Merci,

    Geoffroy

    jeudi 7 février 2013 16:38

Réponses

  • Bonjour,

    Si tu veux créer tes utilisateurs via un script SQL alors que tu utilise le mode "Encrypted" pour générer tes mots de passe (cf web.config), ce ne sera surement pas possible car l'encryption utilise le MachineKey défini dans ton web.config de ton application Web. Les procédures stockées que le Membership utilise ne font qu'insérer les valeurs données en paramètre. Donc si tu donne en paramètre de la procédure stockée un mot de passe en clair, il sera persisté en clair également.

    Par contre, tu peux injecter tes utilisateurs via un petit bout de code C# dans lequel tu maîtrisera tes logins et mots de passe. Attention, ce code doit être exécuté dans le contexte de ton application web actuelle (pour s'appuyer sur le même "MachineKey" de ton web.config). Voici un exemple:

                Dictionary<string, string> users = new Dictionary<string, string>();
                users.Add("user1", "password1");
                users.Add("user2", "password2");
                users.Add("user3", "password3");
                users.Add("user4", "password4");
    
                foreach (KeyValuePair<string, string> user in users)
                {
                    //  La méthode CreateUser(...) possède plusieurs signatures, à toi d'utiliser celle qui te convient
                    Membership.CreateUser(user.Key, user.Value);
                }

    Un exemple de web.config:

    <system.web>
        <!-- MachineKey utilisé pour encrypter les mots de passe -->
        <machineKey validationKey="CBF779D796AE4570884722B5876B3A9373AFFF8485E468F55A6C733F183ED3D0DFCC590361B99B0E50F6641A00AFE522A40EA70FF42492E49858C84232989C1B" decryptionKey="7C79A2320826C2EF1CA785FA49B487153E3D8CFDCA5B212D0ED37E58AF42D5B6" validation="SHA1" decryption="AES" />
        
        <membership>
          <providers>
            <clear />
            <!-- Mots de passe stockés encryptés en base: passwordFormat="Encrypted" -->
            <add name="AspNetSqlMembershipProvider"
                 type="System.Web.Security.SqlMembershipProvider"
                 connectionStringName="ApplicationServices"
                 enablePasswordRetrieval="false"
                 enablePasswordReset="true"
                 requiresQuestionAndAnswer="false"
                 requiresUniqueEmail="false"
                 maxInvalidPasswordAttempts="5"
                 minRequiredPasswordLength="6"
                 minRequiredNonalphanumericCharacters="0"
                 passwordAttemptWindow="10"
                 passwordFormat="Encrypted"
                 applicationName="/" />
          </providers>
        </membership>
      </system.web>

    Dis nous si c'est assez clair et si ça répond à ta question.

    Merci !

    • Proposé comme réponse fiscaMMC vendredi 8 février 2013 09:37
    • Marqué comme réponse Geoffroy GABEL vendredi 8 février 2013 17:31
    vendredi 8 février 2013 09:22

Toutes les réponses

  • Bonjour

    On doit faire un petit teste:

    On va créer deux utilisateurs avec le même mot de passé en utilisant l’interface application.

    Si les mots de passe sont identiques dans la table, on peut récupérer le mot de passe déjà cryptée et l’utiliser pour Insert dans la BD.

    Même si ils ne sont pas uniques, on peut insérer dans la BD des nouveaux utilisateurs avec un mot de passe cryptée, récupérée au pas antérieur.

    Apres une telle insertion on doit le tester s’il fonctionne bien dans l’appli web.

    Cordialement,

     


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    vendredi 8 février 2013 08:44
  • Bonjour,

    Si tu veux créer tes utilisateurs via un script SQL alors que tu utilise le mode "Encrypted" pour générer tes mots de passe (cf web.config), ce ne sera surement pas possible car l'encryption utilise le MachineKey défini dans ton web.config de ton application Web. Les procédures stockées que le Membership utilise ne font qu'insérer les valeurs données en paramètre. Donc si tu donne en paramètre de la procédure stockée un mot de passe en clair, il sera persisté en clair également.

    Par contre, tu peux injecter tes utilisateurs via un petit bout de code C# dans lequel tu maîtrisera tes logins et mots de passe. Attention, ce code doit être exécuté dans le contexte de ton application web actuelle (pour s'appuyer sur le même "MachineKey" de ton web.config). Voici un exemple:

                Dictionary<string, string> users = new Dictionary<string, string>();
                users.Add("user1", "password1");
                users.Add("user2", "password2");
                users.Add("user3", "password3");
                users.Add("user4", "password4");
    
                foreach (KeyValuePair<string, string> user in users)
                {
                    //  La méthode CreateUser(...) possède plusieurs signatures, à toi d'utiliser celle qui te convient
                    Membership.CreateUser(user.Key, user.Value);
                }

    Un exemple de web.config:

    <system.web>
        <!-- MachineKey utilisé pour encrypter les mots de passe -->
        <machineKey validationKey="CBF779D796AE4570884722B5876B3A9373AFFF8485E468F55A6C733F183ED3D0DFCC590361B99B0E50F6641A00AFE522A40EA70FF42492E49858C84232989C1B" decryptionKey="7C79A2320826C2EF1CA785FA49B487153E3D8CFDCA5B212D0ED37E58AF42D5B6" validation="SHA1" decryption="AES" />
        
        <membership>
          <providers>
            <clear />
            <!-- Mots de passe stockés encryptés en base: passwordFormat="Encrypted" -->
            <add name="AspNetSqlMembershipProvider"
                 type="System.Web.Security.SqlMembershipProvider"
                 connectionStringName="ApplicationServices"
                 enablePasswordRetrieval="false"
                 enablePasswordReset="true"
                 requiresQuestionAndAnswer="false"
                 requiresUniqueEmail="false"
                 maxInvalidPasswordAttempts="5"
                 minRequiredPasswordLength="6"
                 minRequiredNonalphanumericCharacters="0"
                 passwordAttemptWindow="10"
                 passwordFormat="Encrypted"
                 applicationName="/" />
          </providers>
        </membership>
      </system.web>

    Dis nous si c'est assez clair et si ça répond à ta question.

    Merci !

    • Proposé comme réponse fiscaMMC vendredi 8 février 2013 09:37
    • Marqué comme réponse Geoffroy GABEL vendredi 8 février 2013 17:31
    vendredi 8 février 2013 09:22
  • Bonjour,

    Si on manipule directement les tables, il faudrait voir l'algo en place pour le récréer (et cela ne marchera plus si on change la config du membership sur un autre projet).

    Il me semblerait plus simpler d'utiliser l'API membership pour les enregistrer : http://msdn.microsoft.com/en-us/library/d8t4h2es.aspx ce qui enregistrera donc le mot de passe indiqué avec l'algo actuellement configuré sans même avoir besoin de le connaitre...


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    vendredi 8 février 2013 09:33
    Modérateur
  • Merci pour ces réponses, je vais faire comme ça du coup.

    Geoffroy

    vendredi 8 février 2013 17:32