web-dev-qa-db-fra.com

Comment convertir explicitement une chaîne en securestring

Je souhaite que le texte saisi dans la zone de texte soit converti en valeur sécurisée en c # Merci de votre réponse.

40
Indish Cholleti

La méthode la plus simple consiste à parcourir la chaîne source et à ajouter un caractère à la fois à la chaîne sécurisée, comme suit:

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

Inventer une fois et réutiliser des lots. Créer une méthode d'extension simple pour étendre la classe de base de chaîne et la stocker 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();
27
Colin Gardner

Assurez-vous que SecureString est 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;
    }
}
17
MovGP0

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

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 comme la réponse de Balazs Tihanyi:

Google est ton ami... 

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

Presque identique, mais plus court:

SecureString secureString = new SecureString();
textbox1.Text.ToCharArray().ForEach(c => secureString.AppendChar(c));
0
jr_gen

Je suis supposé que personne ne parlait du constructeur SecureString prenant le pointeur sur char array.

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, à l'onglet Générer et cochez la case Autoriser le code non sécurisé.

0
Szybki