Jeu sécurité

Le bug du mois de decembre

Proposé par Eric Vernié

'Pseudo code
Dim utilisateur As String
Console.WriteLine("Entrez votre nom d'utilisateur")
utilisateur = Console.ReadLine()
Dim MotDePasse As String = Nothing
    Console.WriteLine("Entrez votre mot de passe")

    Do While (True)
     Dim cki As ConsoleKeyInfo = Console.ReadKey(false)
     If cki.Key = ConsoleKey.Enter Then
       Authentifier(utilisateur,MotDepasse)
       ?Je vide le mot de passe
       MotDePasse=String.Empty
       Exit do
     End If
     MotDePasse += cki.KeyChar()
    Loop


La bonne réponse

La bonne réponse est :
Il faudrait utiliser une nouvelle classe du framework .Net (SecureString) afin de crypter le mot de passe.

Le type String en .NET est dit immuable. C'est-à-dire qu’il n’existe aucune méthode, pour vider la mémoire du secret qui a été saisie.
En d’autres termes, la ligne MotDePasse=String.Empty ne sert pas à grand-chose, car en mémoire, il existe toujours mon mot de passe en clair.
La bonne réponse est donc d’utiliser la classe SecureString, pour crypter chaque saisie au clavier. Seule la chaîne cryptée sera stockée et à l’abri d’un dump mémoire.


Et le code corrigé

Proposé par Eric Vernié

‘Pseudo Code
Dim MotDepasse As New Security.SecureString
   Console.WriteLine("Entrez votre mot de passe")
     Do While (True)
       Dim cki As ConsoleKeyInfo = Console.ReadKey(false)

       'Pseudo code
       If cki.Key = ConsoleKey.Enter Then
         'Pseudo code
         'Authentifier(utilisateur, MotDepasse)
         Exit Do
       End If
       'Pseudo code
       MotDepasse.AppendChar(cki.KeyChar)
     Loop

Pour aller plus loin

Article à télécharger : L’alternative SecureString pour crypter le mot de passe

Webcast : Le nouveau type SecureString dans le framework .NET 2.0

SecureString Class (en anglais)

Le centre de conseils sur la sécurité pour les développeurs

Writing Secure Code, l’ouvrage de référence  

Le règlement | Comment jouer ? | Liste des gagnants


**
**
**
**
**
**