9
votes

Les structures de mémoire sécurisées .NET

Je sais que la bibliothèque .NET offre une manière de stocker une chaîne de manière protégée / sécurisée = sécrétrage.

Ma question est que je souhaite stocker un tableau d'octets, quel serait le meilleur conteneur le plus sécurisé à conserver cela?


0 commentaires

6 Réponses :


1
votes

Vous pouvez utiliser Securstring pour stocker le tableau d'octets. xxx

alors vous venez d'inverser le processus pour récupérer les octets de retour.


Ce n'est pas le seul moyen, vous pouvez toujours utiliser un mocasseur et et quelque chose hors système.security.cryptographie. Mais c'est la seule chose spécialement conçue pour être sécurisée de cette manière. Tous les autres que vous devriez créer avec le système.security.Cryptographie, qui est probablement le meilleur moyen pour vous d'aller.


7 commentaires

C'est donc la seule structure "sécurisée" de la bibliothèque .NET?


Cela peut entraîner des problèmes si les octets ont 0 valeurs - car vous allez les mettre dans une chaîne NULL terminée.


Securstring est-il terminé par NULL?


Je ne le crois pas. No .NET String n'est terminé par NULL.


Non, ce n'est pas le seul moyen, vous pouvez toujours utiliser un taux de mémoire et une autre de System.security.Cryptographie. Mais c'est la seule chose spécialement conçue pour être sécurisée de cette manière. Tous les autres que vous devriez créer avec le système.Security.Cryptography, qui est probablement la meilleure façon pour vous d'aller.


Notez que cela n'est pas sécurisé par magie car certaines personnes pourraient penser. Vous pouvez facilement attacher au processus et lire la valeur. Cela soulève juste la barre.


L'échantillon présenté ici pour le créer à partir du tableau d'octets est bien, mais il y a un problème lorsque vous essayez de convertir cet octet [] du séchage à un tableau d'octets non protégé, à savoir quelques octets sont corrompus. Voir Stackoverflow.com/posts/36361578



0
votes

une option:

Vous pouvez stocker les octets dans un flux de mémoire, crypté en utilisant n'importe lequel des fournisseurs de la System.Security.Cryptography Espace de noms.


3 commentaires

Vrai, mais avant qu'il ne soit crypté, c'est vulnérable.


Vrai - mais c'est le cas en utilisant n'importe quelle technique - si c'est statique, vous pouvez la crypter à l'avance et lire dans les octets cryptés - mais si c'est dynamique, il va toujours exister à un moment donné non protégé (y compris si vous le nourrissez Sécrétrage). Il s'agit de réduire votre fenêtre vulnérable plus que de l'éliminer.


Securstring a été obsolète.



2
votes

Il n'y a pas de "meilleur" moyen de le faire - vous devez identifier la menace que vous essayez de protéger contre ce qu'il faut décider ou même si quelque chose doit être fait.

Un point à noter est que, contrairement à une chaîne qui est immuable, vous pouvez éteindre les octets dans une matrice d'octets après avoir terminé avec eux, vous n'aurez donc pas le même ensemble de problèmes que Securstring est conçu. résoudre.

Les données de cryptage peuvent être appropriées pour certains problèmes, mais vous devrez alors identifier la manière de protéger la clé de l'accès non autorisé.

J'ai du mal à imaginer une situation où le cryptage d'un tableau d'octets serait de cette manière utile. Plus de détails sur ce que vous essayez de faire.


1 commentaires

Vous ne devriez jamais s'appuyer sur la mise à zéro d'un tableau à des fins de sécurité. Le GC peut déménager le contenu d'un tableau à tout moment, il se peut que une ou plusieurs copies soient laissées dans la mémoire quelque part. Utilisation de System.Security.Cryptography.Protectiondata est la voie à suivre. Il n'est pas impossible de rouler le vôtre avec le maréchal.allOchglobal, mais il y a beaucoup trop de façons de faire ce problème.



3
votes

AS de .NET 2.0 Utilisez la méthode ProtégateData.Protect, on dirait que le réglage de la portée de DataProtectionsCope.CurrentUser doit donner le même effet souhaité que Secure String

Exemple d'utilisation prise d'ici < href = "http://msdn.microsoft.com/en-us/library/system.security.cryptography.proteintdata.protect.aspx" rel = "nofollow"> http://msdn.microsoft.com/en-us /Library/system.security.cryptography.proteintdata.protect.aspx xxx


2 commentaires

J'ai créé un package Nuget à partir de cet exemple, ces exmples a helpd un merci. [Paquet Nuget ici] [1] [1]: Nuget.org/packages/secuRays


Il est important de noter que pour ceux qui se développent dans .NET CORET et .NET 5.0+ que cette fonctionnalité ne soit disponible que sur les systèmes d'exploitation Windows.



11
votes

Il est important de comprendre la vulnérabilité du type System.String. Il est impossible de le rendre complètement sécurisé, la sécrétrage existe pour minimiser le risque d'exposition. System.string est risqué car:

  • Leur contenu est visible ailleurs, sans avoir à utiliser un débogueur. Un attaquant peut regarder dans le fichier de pagination (c: \ pagefile.sys), il conserve le contenu des pages RAM qui ont été échangés sur le disque pour faire de la place pour d'autres programmes qui ont besoin de RAM
  • System.string est immuable, vous ne pouvez pas frotter le contenu d'une chaîne après l'avoir utilisé
  • Le tas recueilli de la poubelle compacte le tas mais ne réinitialise pas le contenu de la mémoire qui a été libéré. Qui peut laisser une copie des données de chaîne en mémoire, entièrement hors de portée de votre programme.

    Le risque claire ici est que le contenu de la chaîne peut être visible longtemps après l'utilisation de la chaîne, augmentant ainsi considérablement les chances qu'une attaquante peut la voir. Securstring fournit une solution de contournement en stockant la chaîne dans la mémoire non gérée, où elle n'est pas soumise au collecteur des ordures laissant des copies errantes du contenu de la chaîne.

    Il convient de claire maintenant comment vous pouvez créer votre propre version de la matrice sécurisée avec le même type de garanties que Securstring fournit. Vous faites pas avez le problème de l'immutabilité, nettoyant la matrice après avoir utilisé ce n'est pas un problème. Ce qui est en soi presque toujours suffisant, implicite de réduire la probabilité d'exposition, c'est que vous ne conservez pas une référence à la matrice très longue non plus. Donc, les chances de la copie non nettoyée des données de la matrice survivant après une collecte des ordures doivent déjà être faibles. Vous pouvez réduire ce risque également, présent uniquement pour les tableaux inférieurs à 85 000 octets. Soit en le faisant la manière dont le séchage est-il et utilise le maréchal.allOchglobal (). Ou beaucoup plus facile par épingler le tableau, gchandle.alloc ().


0 commentaires

2
votes

une combinaison de rtlzeromemory code> et virtuallock code> peut faire ce que vous voulez. Viruallock Si vous souhaitez conserver les données de l'échange sur le disque et la rtlzeromemorie pour que la mémoire soit mise à zéro (j'ai essayé d'utiliser rtlsecurezeromemory code> mais qui ne semble pas exister dans kernel.dll) la classe ci-dessous stocker une matrimonie de tous les types intégrés de manière sécurisée. J'ai cassé la solution en deux classes pour séparer le code de type-agnostique.

La première classe vient d'allouer et contient un tableau. Il fait un contrôle d'exécution que le type de modèle est un type intégré. Malheureusement, je ne pouvais pas comprendre un moyen de le faire à la compilation. P> xxx pré>

La classe suivante fait le vrai travail. Il indique au collecteur des ordures d'épingler le tableau en mémoire. Il le verrouille ensuite pour que cela ne échange pas. Lors de l'élimination, il zéros le tableau et le déverrouille puis dit au collecteur des ordures de l'impulser. P>

using (var secret = new SecureArray<byte>(secretLength))
{
    DoSomethingSecret(secret.Buffer);
}


2 commentaires

Nuget.org/packages/secureArrays J'ai créé ce package à partir de cet exemple et ajouté support de plate-forme croisée par En utilisant BZERO et MLOCK sur des plates-formes non Windows.


Ha! J'ai soulevé le code de ma mise en œuvre chez Github.com/ mheyman / isopoh.cryptography.argon2 / arbre / ... qui prend en charge Argon2 nuget.org/packages/isopoh.cryptography.argon2