2009-10-15 7 views

Répondre

83

Ce n'est pas le cas. La raison complète de l'utilisation de l'objet SecureString est d'éviter de créer un objet chaîne (qui est chargé en mémoire et conservé en clair jusqu'à la récupération de la mémoire). Cependant, vous pouvez ajouter des caractères à un SecureString en les ajoutant.

var s = new SecureString(); 
s.AppendChar('d'); 
s.AppendChar('u'); 
s.AppendChar('m'); 
s.AppendChar('b'); 
s.AppendChar('p'); 
s.AppendChar('a'); 
s.AppendChar('s'); 
s.AppendChar('s'); 
s.AppendChar('w'); 
s.AppendChar('d'); 
+18

N'oubliez pas de le faire en lecture seule à l'adresse s.MakeReadOnly(); – ysrb

+3

"La combinaison est" 12345 "... c'est le genre de chose qu'un idiot a sur ses bagages!" –

+0

Tout ce que je vois est ***** ' –

4

Je vais jeter ça là-bas. Pourquoi?

Vous ne pouvez pas simplement changer toutes vos chaînes pour sécuriser les chaînes et soudainement votre application est "sécurisée". La chaîne sécurisée est conçue pour garder la chaîne cryptée aussi longtemps que possible, et seulement décryptée pendant une période de temps très courte, effaçant la mémoire après qu'une opération a été effectuée sur elle.

Je me risquerais à dire que vous pourriez avoir quelques problèmes de niveau de conception à traiter avant de vous soucier de la sécurisation de vos chaînes d'application. Donne-nous plus d'informations sur ce que tu essaies de faire et nous pourrons peut-être mieux t'aider.

+1

Je veux juste l'utiliser pour définir un mot de passe pour ProcessStartInfo et exécuter mon exe utilisateur comme différent. Cela a fonctionné pour moi ... – Nila

+2

Mon application est sécurisée en l'exécutant sur un système sécurisé. Je m'en fous de cette chaîne particulière cryptée en mémoire. Il y a beaucoup plus d'informations vitales sur ce système à s'inquiéter s'il devait être compromis. SecureString est simplement requis par une API Microsoft que mon programme doit utiliser. Il est implicite que le développeur considère son propre cas d'utilisation et détermine si la conversion de Strings en SecureStrings est une opération valide en contexte. – Dan

3

Je suis d'accord avec Spence (+1), mais si vous le faites pour l'apprentissage ou de test pourposes, vous pouvez utiliser un foreach dans la chaîne, chaque char annexant la SecureString en utilisant la méthode AppendChar .

39

ci-dessous méthode permet de convertir la chaîne à chaîne sécurisée

private SecureString ConvertToSecureString(string password) 
{ 
    if (password == null) 
     throw new ArgumentNullException("password"); 

    var securePassword = new SecureString(); 

    foreach (char c in password) 
     securePassword.AppendChar(c); 

    securePassword.MakeReadOnly(); 
    return securePassword; 
} 
+11

+1, mais notez que le passage du mot de passe en tant que paramètre de chaîne crée une instance de chaîne non cryptée dans la mémoire gérée et annule l'objectif de 'SecureString' en premier lieu. Juste en faisant remarquer cela pour les futures personnes qui viennent et utilisent ce code. – Cody

+5

@Cody C'est vrai, et c'est un bon point, mais beaucoup d'entre nous ne se soucient pas de savoir si SecureString est sécurisé ou pas et ne l'utilisent que parce que certaines API Microsoft le requièrent comme paramètre. – Dan

11

Vous pouvez suivre ceci:

string password = "test"; 
SecureString sec_pass = new SecureString(); 
Array.ForEach(password.ToArray(), sec_pass.AppendChar); 
sec_pass.MakeReadOnly(); 
6
unsafe 
{ 
    fixed(char* psz = password) 
     return new SecureString(psz, password.Length); 
} 
5

Voici une astuce LINQ pas cher.

  SecureString sec = new SecureString(); 
      string pwd = "abc123"; /* Not Secure! */ 
      pwd.ToCharArray().ToList().ForEach(c => sec.AppendChar(c)); 
      /* and now : seal the deal */ 
      sec.MakeReadOnly(); 
+11

Cette réponse est un exercice est de voir combien de copies temporaires du texte brut peuvent être générés en un seul coup –

2

Si vous souhaitez compresser la conversion d'un string à un SecureString dans une déclaration LINQ, vous pouvez l'exprimer comme suit:

var plain = "The quick brown fox jumps over the lazy dog"; 
var secure = plain 
      .ToCharArray() 
      .Aggregate(new SecureString() 
         , (s, c) => { s.AppendChar(c); return s; } 
         , (s) => { s.MakeReadOnly(); return s; } 
         ); 

Cependant, gardez à l'esprit que l'utilisation LINQ n'améliore pas la sécurité de cette solution. Il souffre du même défaut que toute conversion de string à SecureString. Tant que le string d'origine reste en mémoire, les données sont vulnérables. Ceci étant dit, ce que l'instruction ci-dessus peut offrir est de conserver ensemble la création du SecureString, son initialisation avec des données et enfin de la verrouiller à partir de la modification.

3

pas de fantaisie LINQ, de ne pas ajouter tous les caractères à la main, tout simplement et simple:

var str = "foo"; 
var sc = new SecureString(); 
foreach(char c in str) sc.appendChar(c); 
+0

encore plus colombophile, pas besoin de définir une variable – bigworld12

+0

voici un seul doublure: 'var sc = new SecureString(); foreach (char c dans "foo") sc.appendChar (c); ' – bigworld12

44

Il y a aussi une autre façon de convertir entre SecureString et String.

1. Chaîne à SecureString

SecureString theSecureString = new NetworkCredential("", "myPass").SecurePassword; 

2.SecureString à cordes

string theString = new NetworkCredential("", theSecureString).Password; 

Voici les link

+1

C'est la meilleure solution de loin pour le cas d'utilisation le plus commun! – Dan

+3

Il ne sert à rien d'utiliser un 'SecureString' si votre code crée un objet' string' avec la valeur que vous voulez sécuriser. Le but de 'SecureString' est d'éviter d'avoir la chaîne dans la mémoire gérée, donc un attaquant examinant cette mémoire peut repérer la valeur que vous voulez cacher. Puisque le constructeur 'NetworkCredential' que vous appelez nécessite une chaîne, ce n'est pas la bonne façon de procéder ... Bien sûr, votre code est un moyen facile de convertir depuis et vers un SecureString, mais l'utiliser rend votre code aussi sûr que d'utiliser un simple 'string' –

0

Les 2 extensions suivantes devraient faire l'affaire:

  1. Pour un tableau char

    public static SecureString ToSecureString(this char[] _self) 
    { 
        SecureString knox = new SecureString(); 
        foreach (char c in _self) 
        { 
         knox.AppendChar(c); 
        } 
        return knox; 
    } 
    
  2. Et pour string

    public static SecureString ToSecureString(this string _self) 
    { 
        SecureString knox = new SecureString(); 
        char[] chars = _self.ToCharArray(); 
        foreach (char c in chars) 
        { 
         knox.AppendChar(c); 
        } 
        return knox; 
    } 
    

Merci à John Dagg pour la recommandation AppendChar.

2

vous pouvez utiliser ce simple script

private SecureString SecureStringConverter(string pass) 
{ 
    SecureString ret = new SecureString(); 

    foreach (char chr in pass.ToCharArray()) 
     ret.AppendChar(chr); 

    return ret; 
} 
+0

Cette réponse [a été posté il y a 15 mois] (https://stackoverflow.com/a/38326325/11683). Il n'y avait vraiment pas besoin de le poster à nouveau. – GSerg

0

Une approche plus facile qui peut être utilisé:

# Take password and convert it to a secure string 
$mySS = "MyCurrentPassword" | ConvertTo-SecureString -AsPlainText -Force 
Questions connexes