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

VB.NET Discussion :

Chiffrement mot de passe : MD5, SHA1, AES ?


Sujet :

VB.NET

  1. #1
    Membre régulier Avatar de zarohn
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 148
    Points : 94
    Points
    94
    Par défaut Chiffrement mot de passe : MD5, SHA1, AES ?
    Salut à tous

    grâce à ce post : http://www.developpez.net/forums/d48...tage-passe-md5 j'ai pu implémenter dans mon application une fonction de cryptage de mes mots de passes en MD5 afin qu'ils ne soient pas stocké en clair dans ma BDD. Ça a l'air de bien fonctionner. Ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        Public Function Crypte_md5(ByVal chaine As String) As String
            Dim tab_byte() As Byte
            tab_byte = System.Text.Encoding.ASCII.GetBytes(chaine)
            Dim md5 As New Security.Cryptography.MD5CryptoServiceProvider()
            tab_byte = md5.ComputeHash(tab_byte)
            Dim sb As New System.Text.StringBuilder
            Dim resultat As String
            For i = 0 To (tab_byte.Length) - 1
                sb.AppendFormat("{0:X2}", tab_byte(i))
            Next i
            resultat = sb.ToString.ToLower()
            Return resultat
        End Function
    Maintenant ce que j'aimerai faire c'est la fonction inverse, pour décrypter du MD5 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Public Function Decrypte_md5(ByVal chaine As String) As String
           ...
        End Function
    Si quelqu'un était capable de m'aider .... Merci d'avance !


  2. #2
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    MD5 n'est pas un algorithme de chiffrement (et non cryptage) mais un algorithme de hachage, c'est à dire qu'il sert à calculer l'empreinte d'une valeur. Et un algorithme de hachage n'est pas réversible, contrairement au chiffrement. Donc ce que tu veux faire n'est pas possible.

    Si tu veux protéger une donnée il faut regarder du côté du chiffrement / déchiffrement, avec AES par exemple.
    Pas de questions techniques par MP

  3. #3
    Membre régulier Avatar de zarohn
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 148
    Points : 94
    Points
    94
    Par défaut
    Salut, déjà merci pour ta réponse et tes précisions car je suis un ultra-noob en cryptage, hachage et autres joyeusetés. Donc si je comprend bien md5 ne peut pas être utilisé pour ses mots de passes ? Pourtant si je lis wikipedia (http://fr.wikipedia.org/wiki/MD5) je trouve ceci :

    MD5 peut aussi être utilisé pour calculer l'empreinte d'un mot de passe ; c'est le système employé dans GNU/Linux avec la présence d'un sel compliquant le décryptage. Ainsi, plutôt que de stocker les mots de passe dans un fichier, ce sont leurs empreintes MD5 qui sont enregistrées, de sorte que quelqu'un qui lirait ce fichier ne pourra pas découvrir les mots de passe.
    Si ils stockent les mots de passent en md5 c'est donc qu'ils doivent pouvoir faire l'inverse pour aller les lire non ?

  4. #4
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Généralement les mots de passe sont effectivement sauvegardés sous la forme d'une empreinte calculée par un algorithme de hachage (MD5, SHA1 ou autre).

    Ensuite lorsque l'on veut vérifier qu'un mot de passe saisi est correct il suffit alors de comparer les empreintes. Si l'empreinte du mot de passe saisi correspond à l'empreinte sauvegardée alors le mot de passe est bon
    Pas de questions techniques par MP

  5. #5
    Membre régulier Avatar de zarohn
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 148
    Points : 94
    Points
    94
    Par défaut
    Ok je commence à comprendre. Donc MD5 / SHA1 c'est possible seulement si on a pas besoin de retrouver en clair le mot de passe (identification seulement par exemple auquel cas on compare les empruntes) et si dans mon appli j'ai un endroit "gestion de mot de passe" ou l'utilisateur peut voir son mot de passe en clair pour éventuellement le modifier la je dois appliquer un réel chiffrement par clé (donc réversible contrairement aux empruntes non réversibles) ? Est ce bien ça ?

  6. #6
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    C'est inutile de voir son mot de passe pour le modifier. Il faut juste demander l'ancien (on comparera les empreintes) et demander deux fois le nouveau histoire d'éviter les erreurs de frappes

    Mais si tu veux faire du réversible tu dois passer par du chiffrement.
    Pas de questions techniques par MP

  7. #7
    Membre régulier Avatar de zarohn
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 148
    Points : 94
    Points
    94
    Par défaut
    J'ai absolument besoin de faire du réversible,
    je vais donc regarder du coté d'AES et essayer d'adapter le code que tu m'a passé plus haut de c# à vb ...

  8. #8
    Membre régulier Avatar de zarohn
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 148
    Points : 94
    Points
    94
    Par défaut
    Bon voila j'ai adapté le code en vb, je met la solution :

    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
      Public Function EncryptString(ByVal clearText As String, ByVal strKey As String, ByVal strIv As String) As String
            Try
                Dim plainText() As Byte
                plainText = System.Text.Encoding.UTF8.GetBytes(clearText)
                Dim key() As Byte
                key = System.Text.Encoding.UTF8.GetBytes(strKey)
                Dim iv() As Byte
                iv = System.Text.Encoding.UTF8.GetBytes(strIv)
     
                Dim rijndael As System.Security.Cryptography.RijndaelManaged = New System.Security.Cryptography.RijndaelManaged()
                rijndael.Mode = System.Security.Cryptography.CipherMode.CBC
                Dim aesEncryptor As System.Security.Cryptography.ICryptoTransform = rijndael.CreateEncryptor(key, iv)
                Dim ms As System.IO.MemoryStream = New System.IO.MemoryStream()
                Dim cs As System.Security.Cryptography.CryptoStream = New System.Security.Cryptography.CryptoStream(ms, aesEncryptor, System.Security.Cryptography.CryptoStreamMode.Write)
                cs.Write(plainText, 0, plainText.Length)
                cs.FlushFinalBlock()
                Dim CipherBytes() As Byte = ms.ToArray()
                ms.Close()
                cs.Close()
                Return Convert.ToBase64String(CipherBytes)
            Catch ex As Exception
                MessageBox.Show("Erreur dans EncryptString" + ex.Message)
                Return Nothing
            End Try
        End Function
    Ça fonctionne bien en faisant des appels comme ça (16 char pour la clé donne du AES 128bits) :

    EncryptString("itsATest", "abc123deaoezdf77", "aupo8e3nv9iGwm0z"))
    Me reste à adapter la fonction inverse pour le décryptage.
    Par contre j'ai une question, à quoi sert le 3e parametre nommé "Vecteur d'initialisation", sur le tuto c# il est dit :

    Un vecteur d'initialisation est un bloc de données aléatoires utilisé dans le processus de chiffrement du premier bloc de données. Cette séquence de bits, généralement de la même longueur que celle des blocs de données chiffrées, est souvent stockée sous forme de texte pour plus de facilité. Comme pour la clé de chiffrement, un vecteur d'initialisation de 128 bits représente 16 caractères UTF-8.
    Le seul truc que j'ai compris c'est qu'il doit avoir la même taille que la clé.
    Mais à quoi sert t'il ? Est-ce une sorte de "seconde clé" ?

    Merci

  9. #9
    Membre régulier Avatar de zarohn
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 148
    Points : 94
    Points
    94
    Par défaut
    J'ai également adapté la fonction de décryptage :

    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
    Public Function DecryptString(ByVal cipherText As String, ByVal strKey As String, ByVal strIv As String) As String
            Try
                Dim cipheredData() As Byte
                cipheredData = System.Text.Encoding.UTF8.GetBytes(cipherText)
                Dim key() As Byte
                key = System.Text.Encoding.UTF8.GetBytes(strKey)
                Dim iv() As Byte
                iv = System.Text.Encoding.UTF8.GetBytes(strIv)
     
                Dim rijndael As System.Security.Cryptography.RijndaelManaged = New System.Security.Cryptography.RijndaelManaged()
                rijndael.Mode = System.Security.Cryptography.CipherMode.CBC
                Dim decryptor As System.Security.Cryptography.ICryptoTransform = rijndael.CreateDecryptor(key, iv)
                Dim ms As System.IO.MemoryStream = New System.IO.MemoryStream(cipheredData)
                Dim cs As System.Security.Cryptography.CryptoStream = New System.Security.Cryptography.CryptoStream(ms, decryptor, System.Security.Cryptography.CryptoStreamMode.Read)
                Dim plainTextData(cipheredData.Length) As Byte
                Dim decryptedByteCount As Integer = cs.Read(plainTextData, 0, plainTextData.Length)
                ms.Close()
                cs.Close()
                Return System.Text.Encoding.UTF8.GetString(plainTextData, 0, decryptedByteCount)
            Catch ex As Exception
                MessageBox.Show("Erreur dans DecryptString" + ex.Message)
                Return Nothing
            End Try
        End Function
    Seulement quand je la teste en faisant :

    Dim crypt As String = mdl_Password.EncryptString("itsATest", "abc123deaoezdf77", "aupo8e3nv9iGwm0z")
    MessageBox.Show(crypt)
    MessageBox.Show(mdl_Password.DecryptString(crypt, "abc123deaoezdf77", "aupo8e3nv9iGwm0z"))
    J'obtiens une exception disant :

    Longueur des données à déchiffrer non valide
    Exception se produisant apparemment à la ligne

    Dim decryptedByteCount As Integer = cs.Read(plainTextData, 0, plainTextData.Length)
    Un peu d'aide pour résoudre cette erreur serait la bienvenue.
    Merci d'avance.

  10. #10
    Membre régulier Avatar de zarohn
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 148
    Points : 94
    Points
    94
    Par défaut
    Il y a un exemple vb ici http://www.obviex.com/samples/Encryption.aspx
    Il me semble pourtant avoir fait la même chose

    Edit : trouvé, l'erreur venait du fait que j'avais écrit

    cipheredData = System.Text.Encoding.UTF8.GetBytes(cipherText)
    et il fallait

    cipheredData = Convert.FromBase64String(cipherText)

  11. #11
    Membre régulier Avatar de zarohn
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 148
    Points : 94
    Points
    94
    Par défaut
    Je poste donc les versions finales et passe le sujet en résolu.

    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
    Public Function EncryptString(ByVal clearText As String, ByVal strKey As String, ByVal strIv As String) As String
            Try
                Dim plainText() As Byte
                plainText = System.Text.Encoding.UTF8.GetBytes(clearText)
                Dim key() As Byte
                key = System.Text.Encoding.UTF8.GetBytes(strKey)
                Dim iv() As Byte
                iv = System.Text.Encoding.UTF8.GetBytes(strIv)
     
                Dim rijndael As System.Security.Cryptography.RijndaelManaged = New System.Security.Cryptography.RijndaelManaged()
                rijndael.Mode = System.Security.Cryptography.CipherMode.CBC
                Dim aesEncryptor As System.Security.Cryptography.ICryptoTransform = rijndael.CreateEncryptor(key, iv)
                Dim ms As System.IO.MemoryStream = New System.IO.MemoryStream()
                Dim cs As System.Security.Cryptography.CryptoStream = New System.Security.Cryptography.CryptoStream(ms, aesEncryptor, System.Security.Cryptography.CryptoStreamMode.Write)
                cs.Write(plainText, 0, plainText.Length)
                cs.FlushFinalBlock()
                Dim CipherBytes() As Byte = ms.ToArray()
                ms.Close()
                cs.Close()
                Return Convert.ToBase64String(CipherBytes)
            Catch ex As Exception
                MessageBox.Show("Erreur dans EncryptString" + ex.Message)
                Return Nothing
            End Try
        End Function
    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
     Public Function DecryptString(ByVal cipherText As String, ByVal strKey As String, ByVal strIv As String) As String
            Try
                Dim cipheredData() As Byte
                cipheredData = Convert.FromBase64String(cipherText)
                Dim key() As Byte
                key = System.Text.Encoding.UTF8.GetBytes(strKey)
                Dim iv() As Byte
                iv = System.Text.Encoding.UTF8.GetBytes(strIv)
     
                Dim rijndael As System.Security.Cryptography.RijndaelManaged = New System.Security.Cryptography.RijndaelManaged()
                rijndael.Mode = System.Security.Cryptography.CipherMode.CBC
                Dim decryptor As System.Security.Cryptography.ICryptoTransform = rijndael.CreateDecryptor(key, iv)
                Dim ms As System.IO.MemoryStream = New System.IO.MemoryStream(cipheredData)
                Dim cs As System.Security.Cryptography.CryptoStream = New System.Security.Cryptography.CryptoStream(ms, decryptor, System.Security.Cryptography.CryptoStreamMode.Read)
                Dim plainTextData(cipheredData.Length) As Byte
                Dim decryptedByteCount As Integer = cs.Read(plainTextData, 0, plainTextData.Length)
                ms.Close()
                cs.Close()
                Return System.Text.Encoding.UTF8.GetString(plainTextData, 0, decryptedByteCount)
            Catch ex As Exception
                MessageBox.Show("Erreur dans DecryptString" + ex.Message)
                Return Nothing
            End Try
        End Function
    Si quelqu'un peut en dire plus au sujet du paramètre "Vecteur d'initialisation", qu'il réponde quand même ça m'intéresse de savoir ce que c'est exactement ...

    Un immense merci à StormimOn pour son aide !

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

Discussions similaires

  1. securité mot de passe en sha1
    Par UN|X` dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 20/12/2007, 10h50
  2. Authentification DIGEST + JDBC + Mots de passe MD5
    Par hackrobat dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 22/11/2007, 09h42
  3. [LDAP] Chiffrement mot de passe LDAP pour interface en PHP
    Par sedannais dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 10/08/2007, 16h17
  4. [Sécurité] Codage mot de passe md5
    Par tilou dans le forum Langage
    Réponses: 6
    Dernier message: 12/04/2006, 11h55
  5. Cacher encryptage mot de passe MD5
    Par cirdec dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 21/02/2006, 20h10

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