web-dev-qa-db-fra.com

Comment éviter d'utiliser System.String avec Rfc2898DeriveBytes en C #

Je crée une webapp core .NET en C # qui prend un mot de passe utilisateur et le hache pour le stocker sur un serveur. J'utilise Rfc2898DeriveBytes Avec un sel généré aléatoirement. J'ai lu, cependant, que je devrais éviter d'utiliser des chaînes dans tout le processus car les chaînes ne peuvent pas être supprimées de la mémoire. Je sais que le noyau .NET a un PasswordBox qui conserve le mot de passe en tant que SecureString, mais SecureStrings ne peut pas être converti en un tableau d'octets pour être transmis à Rfc2898DeriveBytes le constructeur sans beaucoup de manigances.

Étant donné que la webapp ne s'exécutera que sur mon serveur, puis-je simplement reconvertir le SecureString en chaîne dès qu'il a été transmis à ma webapp? Si un attaquant parvient à accéder au serveur RAM pour rechercher une chaîne non supprimée, il y a probablement très peu de choses que je puisse faire pour protéger quoi que ce soit au départ.

Si je dois continuer à utiliser SecureStrings, quelles sont les meilleures pratiques pour le hacher pour le stocker?

27
Jeff

L'utilisation correcte de SecureString est difficile et protège contre une surface de menace peu probable dans la plupart des cas d'utilisation. Comme vous le dites, si un attaquant peut lire votre mémoire, vous avez d'autres problèmes. Je conseillerais d'utiliser des chaînes normales au lieu de SecureString, sauf si vous êtes inquiété par des attaquants transportant de l'azote liquide avec un accès physique à votre serveur.

Si vous voulez vraiment utiliser SecureStrings, vous devez P/invoquer l'API de chiffrement Windows pour avoir le contrôle de la mémoire. J'ai un exemple dans mon article de blog Comparaison des chaînes sécurisées dans .NET .

34
Sjoerd

L'équipe .NET Core recommande spécifiquement de ne pas utiliser SecureString pour les nouveaux développements. Voir la documentation ( SecureString :

Nous vous déconseillons d'utiliser la classe SecureString pour de nouveaux développements. Pour plus d'informations, consultez SecureString ne doit pas être utilisé sur GitHub.

ainsi que le raisonnement de l'équipe sur GitHub :

Motivation

  • Le but de SecureString est d'éviter d'avoir des secrets stockés dans la mémoire du 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 raccourcit simplement la fenêtre pour obtenir le texte brut; cela ne l'empêche pas complètement car .NET doit encore 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 comme une 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, soit en raison d'API manquantes ou de problèmes de gestion des clés.
49
Vivelin