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 :

.Net 4 UnicodeEncoding et SecureString


Sujet :

Windows Forms

  1. #1
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut .Net 4 UnicodeEncoding et SecureString
    Salut tout le monde en C#4 la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uEncoding.GetBytes(source)
    ne compile plus, getbytes ne prend qu'un type string.

    Comment je peux faire pour que cela fonctionne ?

    Voici mon code complet


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
       public String CreateHash(SecureString source)
            {
                UnicodeEncoding uEncoding = new UnicodeEncoding();
                //Stocke la chaine source dans un tableau d'octet
                Byte[] octetsSource = uEncoding.GetBytes(source);
     
                SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
                //Création du Hash
                Byte[] octetsHash = sha1.ComputeHash(octetsSource);
                //Retourne une chaine encodé en base 64 qui est plus lisible
                //qu'une chaine hashée
                return Convert.ToBase64String(octetsHash);
            }

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    ???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uEncoding.GetBytes(source.ToString())

  3. #3
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    ca fait pas une copie de la chaine en mémoire ça ?
    Si c est le cas ce n'est pas sécurisé ..

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    Je sais, d'où le .

    En 3.5, il y a les mêmes surcharges.

    Moi, je pense que SecureString n'est plus convertible en Char[].

    Pouvez-vous voir, avec le Framework 3.5, comment la conversion se fait, en débuggant en mode pas à pas.

  5. #5
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    En même temps, s'inquiéter de la sécurité d'une chaine de caractère en voyant la ligne :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    Byte[] octetsSource = uEncoding.GetBytes(source);
    c'est ... inquiétant ...

    à supposé que uEncoding.GetBytes(source) fonctionne, à votre avis à ce moment là il y aura quoi dans octetsSource ? une chaine unicode en clair ...

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    "octetsSource" serait une liste de byte en mémoire qui pourra être effacé soit par la méthode Dispose soit par le GarbageCollector, donc plus ou moins transitoirement.

    Si c'était une string, elle serait stocké dans le pool de string de l'AppDomain ou du Runtime .NET, donc beaucoup beaucoup plus longtemps.

    Sécurité + String =

    D'où les SecureString.

  7. #7
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Si on veux espionner le contenu d'un byte[], c'est vraiment pas plus compliqué qu'un string normal. (D'ailleurs en mémoire un string c'est une chaine de caractères unicode).

    Un dispose n'efface pas le contenu du byte[], et même après un passage du garbage collector le contenu du byte[] peut subsister (le GC libère l'espace alloué mais ne remet pas tout à zéro). De plus, le GC n'est pas connu pour passer spécialement souvent.

    Donc au final, une chaine "décryptée" dans un byte[] pourrait en principe survivre plusieurs minutes en mémoire alors comparé à la durée de vie d'un string, c'est largement suffisant pour avoir une fuite.

    Sinon, il y a un lien très complet pour l'utilisation des SecureString pour faire un peux ce qu'on veux. On doit pouvoir en faire ressortir une solution ...
    http://dotnet.org.za/markn/archive/2...passwords.aspx

Discussions similaires

  1. [Débat] Technologie .NET vs JAVA
    Par neo.51 dans le forum Débats sur le développement - Le Best Of
    Réponses: 1047
    Dernier message: 14/01/2019, 16h15
  2. A ceux qui ont migré de VB6 vers VB.Net
    Par Fox dans le forum VB 6 et antérieur
    Réponses: 81
    Dernier message: 21/05/2008, 14h56
  3. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  4. Fichier PDOXUSRS.NET
    Par yannick dans le forum Paradox
    Réponses: 5
    Dernier message: 05/04/2002, 09h45

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