51 votes

Comment convertir une chaîne en securestring explicitement

Je veux que le texte entré dans la zone de texte soit converti en securestring en c#.

88voto

Balazs Tihanyi Points 2530

L'approche la plus simple consiste à parcourir la chaîne source et à ajouter un caractère à la fois à la chaîne sécurisée, comme ceci :

 var secure = new SecureString();
foreach (char c in textbox1.Text)
{
    secure.AppendChar(c);
}

34voto

Colin Gardner Points 81

Inventez une fois et réutilisez des lots. Créez une méthode d'extension simple pour étendre la classe de base de chaîne et stockez-la quelque part dans une classe d'utilitaires statiques

 using System.Security;

/// <summary>
/// Returns a Secure string from the source string
/// </summary>
/// <param name="Source"></param>
/// <returns></returns>
public static SecureString ToSecureString(this string source)
{
    if (string.IsNullOrWhiteSpace(source))
        return null;
    else
    {
        SecureString result = new SecureString();
        foreach (char c in source.ToCharArray())
            result.AppendChar(c);
        return result;
    }
}

puis appelez comme suit :

 textbox1.Text.ToSecureString();

18voto

MovGP0 Points 77

Vous devez rendre SecureString en lecture seule. Le code devrait donc ressembler à ceci :

 static class SecureStringExtensions
{
    public static string ToUnsecureString(this SecureString secureString)
    {
        if (secureString == null) throw new ArgumentNullException("secureString");

        var unmanagedString = IntPtr.Zero;
        try
        {
            unmanagedString = Marshal.SecureStringToGlobalAllocUnicode(secureString);
            return Marshal.PtrToStringUni(unmanagedString);
        }
        finally
        {
            Marshal.ZeroFreeGlobalAllocUnicode(unmanagedString);
        }
    }

    public static SecureString ToSecureString(this string unsecureString)
    {
        if (unsecureString == null) throw new ArgumentNullException("unsecureString");

        return unsecureString.Aggregate(new SecureString(), AppendChar, MakeReadOnly);
    }

    private static SecureString MakeReadOnly(SecureString ss)
    {
        ss.MakeReadOnly();
        return ss;
    }

    private static SecureString AppendChar(SecureString ss, char c)
    {
        ss.AppendChar(c);
        return ss;
    }
}

2voto

Szybki Points 31

Je suis surpris que personne n'ait mentionné que le constructeur SecureString prend le pointeur vers le tableau de caractères.

 public static SecureString ToSecureString(this string source)
{
    char[] charArray = source.ToCharArray();
    unsafe
    {
        fixed (char* chars = charArray)
        {
            return new SecureString(chars, charArray.Length);
        }
    }
}

Notez que ce code ne fonctionne qu'avec l'option de compilateur /unsafe Pour définir cette option, accédez aux propriétés du projet, onglet Générer et cochez la case Autoriser le code non sécurisé.

1voto

ParsaG72 Points 29

Il est peut-être un peu tard, mais vous pouvez convertir SecureString en String de cette façon soit

 using System.Security;
.
.
.
/// <summary>
/// Converts String to SecureString
/// </summary>
/// <param name="input">Input in String</param>
/// <returns>Input in SecureString</returns>
public SecureString String2SecureString(String input) {
    SecureString _output = new SecureString();
    input.ToCharArray().ToList().ForEach((q) => _output.AppendChar(q));
    return _output;
}

bien que tout de même la réponse de Balazs Tihanyi :

Google est ton ami...

 var secure = new SecureString(); 
foreach(char c in textbox1.Text) 
{
secure.AppendChar(c); 
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X