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 :

[VB.NET] cryptage de mot de passe. [FAQ]


Sujet :

Windows Forms

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 291
    Points
    291
    Par défaut [VB.NET] cryptage de mot de passe.
    Bonjour

    Je souhaiterais protéger mon application par un mot de passe. J'utilise

    pour cela un cryptage MD5 pour pouvoir enregistrer le mot de passe dans

    un fichier. Mais mon problème est le suivant :

    Je ne sais pas quoi utiliser comme clé de cryptage et surtout je ne sais

    pas ou l'enregistrer pour que personne ne puisse la réutiliser ...

    Bien sur, si vous avez d'autres solutions de crytage (plus adaptées peut

    être) je suis prenneur.

    Merci de votre aide

  2. #2
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Salut !

    le MD5 ne requiere aucune clef ... c'est une table de hachage unique qui ne te permet pas de décrypter une chaine encrypté .

    Pour les mot de passe typiquement on compare les chaine crypté.
    - MVP C#
    -Tout problème a une solution, le vrai problème est de trouver la solution .....
    - Linux & mono : l'avenir

  3. #3
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Exemple d'utilsiation du MD5, dans un de mes projets (C#):

    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
     
    // Un StringBuilder est plus rapide qu'une chaîne de caractère pour la concaténation
    				StringBuilder _PassTmp = new StringBuilder();
     
    				//
    				// Le mot de passe Admin est crypté en MD5
    				//
     
    				// On va utiliser le provider de la fonction MD5
    				using (MD5 md5 = new MD5CryptoServiceProvider())
    				{
    					// On stocke le tableau de byte que représente le mot de passe sais par l'utilisateur
    					byte[] buffer = Encoding.Default.GetBytes(_MotDePasse);
     
    					// On stocke, dans un tableau de byte, le hash de ce tableau de byte
    					byte[] result = md5.ComputeHash(buffer);
     
    					// On parcours le tableau de byte pour concaténer les valeurs du tableau et former un chaîne
    					for (int i = 0; i <= result.Length - 1; i++)
    					{
    						_PassTmp.Append(result.GetValue(i).ToString());
    					}
    				}
    A ce moment là, _PassTmp continet ton mot de passe, haché en MD5.

    C'est lui que tu enregistres dans la base de données ou dans un fichier de configuration.

    A+

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 291
    Points
    291
    Par défaut
    Merci Morpheus pour ton code. Mais mon problème est le suivant.

    Si j'enregistre mon mot de passe dans un fichier, n'importe qui peut le

    remplacer par un autre mot de passe crypté par le même procédé

    (qui est quand même particulièrement connu). Dans ce cas, l'ouverture

    de mon application est particulièrement simple .....

    Donc je ne vois pas trop comment faire. Je suis désolé. Mes questions

    paraissent peut être bête mais je débute dans la cryptographie.

    Merci de vos réponses

  5. #5
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Dans ce cas là, plutôt que de passer par un fichier, tu passes par une base de données.

    Maintenant, pour savoir que le mot de passe est haché avec du MD5, faut le découvrir

  6. #6
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Salut !
    Je suis confroonté au meme probleme que toi et je n'es pas trouvé de solution .
    En effet à partir du moment ou tu sauvegardes quelque chose sur le disque, ça peut etre récupéré donc tu ne peux pas sauvegarder une clef de cryptage qui permetterais de crypter ton fichier de mot de passe car il suffirait de récuperer cette clef pour avoir accès au fichier comme si de rien n'était.

    une autre solution est d'en coder en dure dans l'application une clef de cryptage mais la attention au deassemblage car les constantes sont visibles..... Et puis dans le cas d'une application open-source ça marche pas

    Sinon reste la solution des clefs publique/privée . Tu demandes à l'utilisateur de garder sa clef privée sur une clef USB par exemple et quand il en a besion il doit la charger sur le systeme.
    C'est très contraignant et pas forcément évident à utiliser mais c'est aussi la solution la plus sure .
    - MVP C#
    -Tout problème a une solution, le vrai problème est de trouver la solution .....
    - Linux & mono : l'avenir

  7. #7
    Expert éminent
    Avatar de bidou
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2002
    Messages
    3 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 055
    Points : 7 962
    Points
    7 962
    Par défaut
    Je n'ai pas trop compris. Si tu stockes la valeur hachée dans le programme ou est le problème

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 291
    Points
    291
    Par défaut
    Merci pour toutes vos réponses.

    Si je résume, pour crypter mon mot de passe, il faut utiliser des méthodes

    de cryptage ou de hachage connu mais en ayant une combinaison que je

    garde pour moi ...

    D'un autre coté si mon fichier de configuration est supprimé, mon

    application ne peut plus être ouverte (la réinstallation est nécessaire).

    J'en déduis donc qu'il suffit d'avoir l'installe, de supprimer la version

    actuelle pour la remplacer par une nouvelle vec un nouveau mot de

    passe ...

    Je crois que je commence à comprendre pourquoi on dit souvent que

    la sécurité est très difficile.

    Merci

  9. #9
    Expert éminent
    Avatar de bidou
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2002
    Messages
    3 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 055
    Points : 7 962
    Points
    7 962
    Par défaut
    Posons le problème différemment.

    Si ta sécurité demande la saisie d'un mot de passe par l'utilisateur, soit il n'existe qu'un mot de passe, soit un par utilisateurs. Si c'est le premier cas, il suffit de stocker la chaine hachée correspondante dans le code, sinon il faut passer soit par une base de données soit par un fichier.

    Si ta sécurité cherche un code transparent pour l'utilisateur, c'est en effet plus complexe. Dans ce cas, on dérive généralement la clé de la configuration de la machine
    Il existe d'autres approchent, mais tout est une question de ce que tu cherches à obtenir.

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 291
    Points
    291
    Par défaut
    En effet j'ai un seul mot de passe pour tout le monde mais le mot de

    passe doit pouvoir être mis à jour ....

    Si ta sécurité demande la saisie d'un mot de passe par l'utilisateur, soit il n'existe qu'un mot de passe, soit un par utilisateurs. Si c'est le premier cas, il suffit de stocker la chaine hachée correspondante dans le code
    Comment est ce que je peux enregistrer mon mot de passe dans le code

    puisqu'il peut être changé par l'utilisateur ? Y a t'il moyen de l'enregistré

    à la fin du fichier exécutable ou pas ?

    Merci pour votre aide

  11. #11
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par leSeb
    Si ta sécurité demande la saisie d'un mot de passe par l'utilisateur, soit il n'existe qu'un mot de passe, soit un par utilisateurs. Si c'est le premier cas, il suffit de stocker la chaine hachée correspondante dans le code
    Comment est ce que je peux enregistrer mon mot de passe dans le code

    puisqu'il peut être changé par l'utilisateur ?
    S'il peut être changé par l'utilisateur, tu ne peux pas car il faudrait que tu recompiles ton application à chaque changement de mot de passe.

  12. #12
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Bonjour
    Il me semble que le problème est résolu dans aspNet par l'utilisation d'un fichier xml inaccessible par "le client" (Web.Config) il faut donc appliquer le même principe pour une appli Windows en stockant dans un support inaccessible par quelqu'un d'autre que l'administrateur.
    Et comme il n'y a pas de solution parfaite en matière de sécurité, c'est le mieux à faire.
    A toi de choisir
    neguib
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  13. #13
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Citation Envoyé par bidou
    Je n'ai pas trop compris. Si tu stockes la valeur hachée dans le programme ou est le problème
    je ne parlais pas de valeur haché mais de clef de cryptage style RSA . En effet pour du MD5 c'est plus simple mais à mon avis pas satisfaisant .
    - MVP C#
    -Tout problème a une solution, le vrai problème est de trouver la solution .....
    - Linux & mono : l'avenir

  14. #14
    Expert éminent
    Avatar de bidou
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2002
    Messages
    3 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 055
    Points : 7 962
    Points
    7 962
    Par défaut
    Dans ce cas en effet tu dois passer par un fichier. Il y a plusieurs approches possibles, en voici une.

    Dans ton fichier tu mets la valeur hachée du mot de passe. Tu met aussi une valeur de clé dérivée de ce mot de passe par salage (classe PasswordDeriveBytes). Comme tu es le seul (enfin ton programme) à connaitre le vecteur d'initialisation et le salage, quelqu'un d'autre ne peux pas recalculée la clé dérivée juste s'il change le mot de passe, sauf s'il connait le mot de passe d'origine bien sur. Et l'affaire et dans le sac. Bien sur le système n'est pas parfait mais ce n'est déjà pas mal. Et on peut protéger encore plus en multipliant l'opération.

  15. #15
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 291
    Points
    291
    Par défaut
    Merci bidou pour ta réponse ... elle a l'air très intéressante.

    Tu met aussi une valeur de clé dérivée de ce mot de passe par salage PasswordDeriveBytes).
    Mon problème est le suivant. Je suis allé voir l'aide de la classe dans la

    MSDN mais je n'ai pas bien saisi comment il faut s'en servir...

    Aurais-tu un exemple de code pour m'éclaire un peu plus. Je suppose

    qu'il faut utiliser la méthode CryptDeriveKey mais je ne comprend

    pas trop le role des paramètres. De plus je ne sais pas ce qu'est le

    salage. Si tu pouvais m'éclairer ce serait super sympa.

    En tout cas merci à tous pour votre aide.

  16. #16
    Expert éminent
    Avatar de bidou
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2002
    Messages
    3 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 055
    Points : 7 962
    Points
    7 962
    Par défaut
    Prenons un exemple. Je rappelle quand même qu'il s'agit d'une approche possible mais qu'il y en a quantité d'autre.

    Je vais d'abord coder le changement de mot de passe. J'ai donc deux zones de texte txtNewPass et txtConfirm

    Mon code va être
    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
    26
        Private Sub cmdChangePass_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdChangePass.Click
            If String.Compare(Me.txtNewPass.Text, Me.txtConfirm.Text, False) <> 0 Then
                MsgBox("la confirmation à échoué")
                Exit Sub
            End If
            Dim fFichier As New System.IO.StreamWriter(Application.StartupPath & "\ctrl.sec", False)
            Dim bitHachage As Byte()
            Dim wCode As New System.Text.UnicodeEncoding
            Dim bitPass() As Byte = wCode.GetBytes(Me.txtNewPass.Text)
            Dim sha1Hachage As New Security.Cryptography.SHA1CryptoServiceProvider
            bitHachage = sha1Hachage.ComputeHash(bitPass)
            fFichier.WriteLine(Convert.ToBase64String(bitHachage))
            Dim pdb As New Security.Cryptography.PasswordDeriveBytes(Me.txtNewPass.Text, New Byte(7) {21, 10, 16, 21, 32, 2, 78, 9}, "SHA1", 1000)
            Dim DES3Code As New System.Security.Cryptography.TripleDESCryptoServiceProvider
            With DES3Code
                .Key = pdb.GetBytes(16)
                .IV = pdb.GetBytes(8)
            End With
            Dim fMem As New System.IO.MemoryStream
            Dim fCrypt As New Security.Cryptography.CryptoStream(fMem, DES3Code.CreateEncryptor, Security.Cryptography.CryptoStreamMode.Write)
            fCrypt.Write(bitPass, 0, bitPass.Length)
            fCrypt.Close()
            fFichier.WriteLine(Convert.ToBase64String(fMem.ToArray))
            fFichier.Flush()
            fFichier.Close()
        End Sub
    J'explique :
    Je crée le fichier dans lequel je vais stocker mon mot de passe haché, et aussi une version crypté du mot de passe.

    1) Le hachage du mot de passe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim bitHachage As Byte()
    Dim wCode As New System.Text.UnicodeEncoding
    Dim bitPass() As Byte = wCode.GetBytes(Me.txtNewPass.Text)
    Dim sha1Hachage As New Security.Cryptography.SHA1CryptoServiceProvider
    bitHachage = sha1Hachage.ComputeHash(bitPass)
    2) Le cryptage.
    D'abord je dérives une clé du mot de passe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim pdb As New Security.Cryptography.PasswordDeriveBytes(Me.txtNewPass.Text, New Byte(7) {21, 10, 16, 21, 32, 2, 78, 9}, "SHA1", 1000)
    J'utilises ici le mot de passe comme élément de dérivation, mais je pourrais tout aussi bien utiliser un 'mot' définit ou un paramètre de la machine.
    J'initialises ensuite un service cryptographique que je vais alimenter grâce à ma dérivation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim DES3Code As New System.Security.Cryptography.TripleDESCryptoServiceProvider
    With DES3Code
         .Key = pdb.GetBytes(16)
         .IV = pdb.GetBytes(8)
    End With
    Enfin je crypte mon mot de passe avec mon service
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim fMem As New System.IO.MemoryStream
    Dim fCrypt As New Security.Cryptography.CryptoStream(fMem, DES3Code.CreateEncryptor, Security.Cryptography.CryptoStreamMode.Write)
    fCrypt.Write(bitPass, 0, bitPass.Length)
    fCrypt.Close()
    et cette deuxième donnée va aussi dans le fichier.

    Si je modifie une valeur du salage (New Byte(7) {21, 10, 16, 21, 32, 2, 78, 9}) j'obtiens une chaine différente.

    Même si quelqu'un trouve comment j'ai haché le mot de passe, il ne peux pas modifier le fichier pour franchir la sécurité car il faudrait qu'il puisse connaitre le salage ainsi que les paramètres du service de crypto que j'ai employé.

    Le code d'entrée dans l'appli pourrait être alors
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
        Private Sub cmdValider_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdValider.Click
            Dim Reussite As Boolean
            Dim fFichier As System.IO.StreamReader
            Dim bitHachage As Byte()
            Dim wCode As New System.Text.UnicodeEncoding
            Dim bitPass() As Byte = wCode.GetBytes(Me.txtPass.Text)
            Dim sha1Hachage As New Security.Cryptography.SHA1CryptoServiceProvider
            bitHachage = sha1Hachage.ComputeHash(bitPass)
            If System.IO.File.Exists(Application.StartupPath & "\ctrl.sec") Then
                fFichier = New IO.StreamReader(Application.StartupPath & "\ctrl.sec")
                If Convert.ToBase64String(bitHachage).Equals(fFichier.ReadLine) Then
                    Dim pdb As New Security.Cryptography.PasswordDeriveBytes(Me.txtPass.Text, New Byte(7) {21, 10, 16, 21, 32, 2, 78, 9}, "SHA1", 1000)
                    Dim DES3Code As New System.Security.Cryptography.TripleDESCryptoServiceProvider
                    With DES3Code
                        .Key = pdb.GetBytes(16)
                        .IV = pdb.GetBytes(8)
                    End With
                    Dim fMem As New System.IO.MemoryStream
                    Dim fCrypt As New Security.Cryptography.CryptoStream(fMem, DES3Code.CreateEncryptor, Security.Cryptography.CryptoStreamMode.Write)
                    fCrypt.Write(bitPass, 0, bitPass.Length)
                    fCrypt.Close()
                    If Convert.ToBase64String(fMem.ToArray).Equals(fFichier.ReadLine) Then
                        Reussite = True
                    End If
                End If
            Else
                If Convert.ToBase64String(bitHachage).Equals("6Pl/upEE0epQR5SObftn+s2fW3M=") Then
                    Reussite = True
                End If
            End If
            If Reussite Then
                Me.DialogResult = DialogResult.OK
                MsgBox("done")
            Else
                MsgBox("caramba, encore raté")
            End If
        End Sub
    Je vais bien toujours dans le même sens, c'est à dire que je compare des chaines cryptées et jamais des chaines en clair.

  17. #17
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 291
    Points
    291
    Par défaut
    Merci à tous pour vos réponses.

    Je pense pouvoir avancer maintenant avec tout ce que vous m'avez

    conseillé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Cryptage des mots de passe en shell
    Par melmouj dans le forum Linux
    Réponses: 7
    Dernier message: 05/04/2006, 14h27
  2. Cryptage de mot de passe
    Par DJBORIE dans le forum Access
    Réponses: 3
    Dernier message: 17/02/2006, 15h10
  3. cryptage de mot de passe
    Par chti_juanito dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 07/02/2006, 23h29
  4. Oracle 9i - Cryptage de mots de passe sous sql
    Par momo9237 dans le forum Oracle
    Réponses: 2
    Dernier message: 04/01/2006, 11h11
  5. [cryptage] cryptage de mot de passe
    Par LoLoSS dans le forum Sécurité
    Réponses: 5
    Dernier message: 11/05/2004, 12h04

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