Comment afficher en toute sécurité un mot de passe généré de manière aléatoire dans WPF
Par "en toute sécurité", je veux dire de telle manière que GC ne le déplace pas en mémoire, que la copie soit réduite au minimum et qu'elle soit supprimée de la mémoire dès qu'elle n'est plus nécessaire.
J'ai le code pour générer un mot de passe aléatoire, mais je dois l'afficher et je préfère ne pas utiliser un string
pour le faire. Le mot de passe est actuellement généré dans un SecureString
fichier que je peux mettre dans un tampon fixe/épinglé avec lequel travailler. Quel est le moyen le plus sûr de le rendre à l'utilisateur ?
Je ne connais aucun moyen d'afficher un SecureString
sans le convertir en une chaîne normale. En tout état de cause, Microsoft lui-même ne recommande même SecureString
plus la sécurité . Ceci est lié à la page de documentation officielle de msdn :
DE0001 : SecureString ne doit pas être utilisé
Motivation
- Le but de
SecureString
est d'éviter d'avoir des secrets stockés dans la mémoire de processus sous forme de texte brut.- Cependant, même sous Windows,
SecureString
n'existe pas en tant que concept de système d'exploitation.
- Cela rend simplement la fenêtre plus courte ; cela ne l'empêche pas complètement car .NET doit toujours convertir la chaîne en une représentation en texte brut.
- L'avantage est que la représentation en texte brut ne traîne pas en tant qu'instance de
System.String
-- la durée de vie du tampon natif est plus courte.- Le contenu du tableau n'est pas chiffré, sauf sur .NET Framework.
- Dans .NET Framework, le contenu du tableau de caractères interne est chiffré. .NET ne prend pas en charge le chiffrement dans tous les environnements, en raison d'API manquantes ou de problèmes de gestion des clés.
Recommandation
Ne pas utiliser
SecureString
pour le nouveau code. Lors du portage de code vers .NET Core, tenez compte du fait que le contenu du tableau n'est pas chiffré en mémoire.L'approche générale du traitement des informations d'identification consiste à les éviter et à s'appuyer à la place sur d'autres moyens d'authentification, tels que les certificats ou l'authentification Windows.
SecureString
n'est pas une protection vraiment efficace pour les informations sensibles, il limite juste un peu la fenêtre d'attaque et obscurcit les choses.
Mon opinion personnelle est que si vous voulez quand même le montrer à l'utilisateur, vous devriez vraiment vous soucier de son accessibilité dans l'application. Et, en général, la sécurité de la mémoire d'une application est de la responsabilité de l'OS et la sécurité physique du matériel. Si vous devez vous soucier des accès non autorisés à la mémoire de l'application, vous avez déjà un problème de sécurité beaucoup plus important.