29 votes

Meilleure pratique pour enregistrer des données sensibles dans Windows 8

Quelle est la meilleure façon de sauver des données sensibles dans un fichier local dans Windows 8? Je suis le développement d'une application en C# qui doit stocker des jetons d'authentification oAuth/mot de passe. J'ai entendu dire que c'était commun dans .NET pour chiffrer/déchiffrer les données, mais je n'ai pas d'expérience avec ceux de la mécanique. Le chiffrement est toujours recommandé/nécessaire étant donné que les applications Windows 8 ont leur propre personnel/protégé de la zone de stockage similaire à celui de Windows Phone?

Aussi, n'est-ce pas le cryptage/décryptage chaque fois quand vous le demande, les données sont les causes d'un problème de performance? (il serait mieux d'écrire un custom/lite algorithme?)

48voto

Robert Levy Points 18154

Mise à JOUR: s'il vous Plaît être conscient que, bien que moderne/applications metro est limité à piquer des uns et des autres trucs, bureau applications disposent d'un accès illimité à toutes les données stockées par le biais de ces Api. Voir http://www.hanselman.com/blog/SavingAndRetrievingBrowserAndOtherPasswords.aspx qui inclut le code de le démontrer.


Win8 a une nouvelle API appelée PasswordVault qui est conçu pour prendre soin de tous ces problèmes pour vous. Vraiment facile à utiliser, sécurisé et peut être configuré par les utilisateurs de se déplacer entre leurs machines afin qu'elles n'avez qu'à entrer les informations d'identification une fois. J'ai utilisé avec succès ce pour OAuth jetons

Récupération des informations d'identification (remarque stupide exception que WinRT soulève... ils devraient vraiment juste retour null):

const string VAULT_RESOURCE = "[My App] Credentials";
string UserName { get; set; };
string Password { get; set; };
var vault = new PasswordVault();

try
{
   var creds = vault.FindAllByResource(VAULT_RESOURCE).FirstOrDefault();
   if (creds != null)
   {
      UserName = creds.UserName;
      Password = vault.Retrieve(VAULT_RESOURCE, UserName).Password;
   }
}
catch(COMException) 
{
   // this exception likely means that no credentials have been stored
}

Stockage des informations d'identification:

vault.Add(new PasswordCredential(VAULT_RESOURCE, UserName, Password));

Effacer les informations d'identification (lorsque l'utilisateur clique sur le bouton de déconnexion de votre application):

vault.Remove(_vault.Retrieve(VAULT_RESOURCE, UserName));

0voto

HansPolders Points 7

Cela dépend de ce que vous avez besoin, si vous avez vraiment besoin de stocker les mots de passe, vous devez utiliser un 2-way algorithme de chiffrement comme 3DES/RC2/Rijndael etc.

Toutefois, si vous avez besoin pour être en mesure de faire est de vérifier si un mot de passe est correcte, il est recommandé d'utiliser un oneway fonction pour stocker une table de hachage.

Lorsque vous traitez avec des données sensibles, j'ai vraiment vous recommandons de le chiffrer/hachage, même si vous utilisez windows 8. Le chiffrement ne signifie pas une charge supplémentaire, mais dans la plupart des cas, vous ne verrez pas la différence de vitesse.

Il serait mieux d'écrire votre propre personnalisé/lite algorithme? Comme un gars de la sécurité, je vous le conseille. Les gens passent des années de tests, d'améliorer et d'essayer de trouver des trous existants algoritms. Ceux qui ont survécu sont donc assez bonne.

-4voto

Dante1986 Points 6097

vous pouvez crypter comme ceci:

     public static string EncodePassword(string password)
    {
        byte[] bytes = Encoding.Unicode.GetBytes(password);
        byte[] inArray = HashAlgorithm.Create("SHA1").ComputeHash(bytes);
        return Convert.ToBase64String(inArray);
    }
 

Et lors de la vérification de l'entrée utilisateur, vous pouvez également l'intégrer à cette méthode et vérifier qu'elle correspond.

Dans le cas de données que vous mettez dans un xml (par exemple) que vous souhaitez crypter / décrypter, vous pouvez utiliser RijndaelManaged.

-Edit1-

Un exemple: si vous avez un petit écran de connexion qui apparaît (ShowDialog) vous pouvez le faire comme ceci snip-it:

 private void settings_Click(object sender, RoutedEventArgs e)
{
    Login log = new Login();    //login window
    log.ShowDialog();           //show the login window
    string un = log.userName.Text;  //the user input from the username field
    string pw = log.passWord.Password; //the userinput from the password input
    if (EncodePassword(un) == Properties.Settings.Default.adminUsername && EncodePassword(pw) == Properties.Settings.Default.adminPassword) //in my case, i stored it in the app settings, but this could also be somewhere else.
    {
        //login was correct
        //do something
    }
    else
    {
        //login was not correct
    }
}
 

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