36 votes

Comment SecureString est-il "crypté" et toujours utilisable?

Selon MSDN SecureString contenu est crypté pour plus de sécurité, de sorte que si le programme est échangée avec le disque dur le contenu de la chaîne ne peut pas être sous-estimées.

Comment un tel cryptage possible, je me demande? L'algorithme serait fixe et, par conséquent, connus ou d'une franchise (dire que l'un des sept largement utilisé dans l'industrie des algorithmes) et il doit y avoir une clé quelque part dans le programme. Ainsi, l'attaquant pourrait chercher la chaîne cryptée, de récupérer la clé et déchiffrer les données.

Comment ce type de chiffrement être utile?

19voto

NetSquirrel Points 624

Je suis en citant un article sur le DPAPI qui est utilisé pour dériver la clé. Cela devrait répondre à la plupart des questions que vous avez au sujet de SecureString.

Et oui, SecureString a des inconvénients et n'est pas complètement sûr, il existe des moyens pour accéder à des données, par exemple, l'injection de Hawkeye dans le processus est mentionné sur MSDN comme un moyen d'extraire le SecureString. Je n'ai pas personnellement vérifiée cette assertation.

DAPI de Gestion des Clés

DAPI est symétrique de chiffrement basé sur la technique, ce qui signifie qu'il utilise la même clé pour chiffrer et déchiffrer les données. Avant d'arriver à quelques exemples de la façon d'utiliser DAPI il vaut la peine couvrant comment DAPI gère ses clés. Pour la plupart DAPI processus de gestion des clés est invisible et vous n'avez généralement pas besoin de s'inquiéter à ce sujet, qui est la principale raison pour laquelle DAPI est une bonne approche.

Dans l'introduction, j'ai écrit que le maître de la clé est générée à partir de l'identifiant de l'utilisateur mot de passe. Ce n'est pas l'image complète. Ce qui se passe réellement est que Windows utilise le login de l'utilisateur mot de passe pour générer une clé maître. Cette clé principale est protégée à l'aide de l'utilisateur, mot de passe, puis stockés avec le profil de l'utilisateur. Cette master key obtient alors utilisée pour dériver un certain nombre d'autres touches et ces autres touches, qui sont utilisées pour protéger les données.

La raison pourquoi Windows n'est qu'il permet des applications pour ajouter des informations supplémentaires, appelée entropie, le processus de production de la individul clés. Vous verrez que si chaque application en cours d'exécution en vertu de l'utilisateur du compte de connexion utilisé la même clé de toutes les applications pourraient ôter la protection de la DAPI données protégées. Parfois, vous voudrez applications pour être en mesure de partager DAPI données protégées; cependant, parfois, vous ne serez pas. En laissant l'application de contribuer de l'entropie à la génération d'une clé alors que la clé devient spécifiques à l'application et toutes les données qui sont protégés par cette application ne peut pas être protégés de nouveau si ils savent de l'entropie.

Bien que la génération d'une clé maître, et puis en utilisant la clé principale pour générer d'autres touches pour effectuer le chiffrement, peut sembler une longue haleine approche elle possède un avantage majeur. Puisqu'il y a un niveau supplémentaire d'abstraction entre l'utilisateur protégé par mot de passe de la clé principale et les véritables clés utilisés pour protéger les données cela signifie que lorsque l'utilisateur modifie son mot de passe alors que le maître de la clé doivent être protégés; aucune des données protégées doit être re-protégé. Car la clé principale est beaucoup plus petit en taille que les données, puis de façon significative les performances de l'enregistrement est effectué.

Lorsque l'utilisateur modifications de mot de passe puis, bien sûr, une nouvelle clé est générée. Cette nouvelle clé maître est ensuite utilisée pour générer de nouvelles clés individuelles. Cependant, puisque tous les déjà généré des touches ont été calculées à partir de l'ancien maître de la clé alors que Windows a besoin de stocker toutes les précédentes maître des clés, à qui il ne. Windows n'oublie jamais un maître de la clé et de la protection des données est marqué par un GUID qui indique la clé maître était utilisé pour protéger les données. Donc, en termes d'adaptabilité DAPI est en mesure de faire face aux changements de l'utilisateur et des mots de passe, tout en assurant une) que les données protégées n'a pas besoin d'être re-protégé, et b) que les clés utilisées précédemment protéger les données comme toujours disponible, et c) il fait tout cela automatiquement pour vous.

Sauf si l'ordinateur est membre d'un domaine DAPI ne peut que données non protégées sur la même machine que celle qui a été utilisée pour la protéger.

Ainsi que pour permettre à l'utilisateur de niveau de protection, et que le maître clés sont basées sur les mots de passe utilisateur et les données protégées par un utilisateur ne peut pas être protégé par un autre utilisateur, DAPI fournit également de la machine de niveau de protection, que le maître clés sont basées sur la machine de l'information spécifique. Machine de niveau master touches de permettre à des applications de stocker à l'abri de données de sorte qu'il peut être protégé par tous les utilisateurs de l'application. La seule différence dans le processus déjà décrit, c'est la clé principale est généré à partir de la machine de l'information spécifique pas de données propres à l'utilisateur.

11voto

Daniel A. White Points 91889

J'ai regardé un point dans le code et il utilise Windows de l' advapi32 de faire son sale boulot. Donc, la clé n'est pas stocké dans l'application de la mémoire.

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
[DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
internal static int SystemFunction040([In, Out] SafeBSTRHandle pDataIn, [In] uint cbDataIn, [In] uint dwFlag)

Qui est mieux connu sous le nom RtlEncryptMemory.

Il déchiffre avec RtlDecryptMemory (SystemFunction041).

Je suis sûr que le compilateur fait quelque chose avec l' SecurityCriticalAttribute ainsi.

modifier ce qui s'est traduit à l'aide de 4.0. d'autres versions pourraient différents.

7voto

Toby Points 4112

Comme d'autres l'ont déjà répondu, le contenu de SecureString sont cryptées à l'aide de DPAPI, de sorte que les touches ne sont pas stockées dans votre application, ils font partie de l'OS. Je ne suis pas 100% positif, mais je suppose qu' SecureString utilise une clé spécifique à l'utilisateur, de sorte que même si un autre processus a accès au bloc de mémoire, il aurait dû être en cours d'exécution dans les mêmes informations d'identification afin tout simplement de déchiffrer le contenu à l'aide de la DPAPI. Même si ce n', la clé de l'ordinateur (en théorie) empêche la chaîne de facilement décrypté en cas de transfert vers un autre système.

De plus en plus important avec l' SecureString est comment et quand vous l'utilisez. Il devrait être utilisé pour stocker une chaîne de données qui doivent être conservés en mémoire pour "extended" périodes de temps, mais qui ne sont pas souvent nécessaire dans leur forme décryptée. À un certain moment, vous allez avoir à le décrypter en une régulières vieux - System.String, ou un System.Char[]. C'est quand il est le plus vulnérable dans la mémoire. Si vous le faites trop souvent, alors si vous avez plusieurs copies de la chaîne déchiffrée flottant autour dans la mémoire en attente d'être collectés.

En règle générale, si je suis en train de lire des données chiffrées (dire identifiants de connexion) que je dois conserver pour un usage occasionnel (PayPal ou Amazon API interaction, par exemple), puis-je conserver/cache les informations d'identification que SecureString, puis de les décrypter besoin seulement assez longtemps pour faire les appels de service web, et de s'assurer que la durée de vie de tout déchiffré copie est à seulement quelques lignes de code.

C'est probablement aussi sage d'utiliser des blocs critiques ou similaire à la pointe de la CLR qu'il ne convient pas au contexte de l'interrupteur alors que la chaîne déchiffrée est en cours d'utilisation, afin d'améliorer les chances que tout déchiffré les copies sont recueillis avant que la mémoire est mis en cache ou échangé.

2voto

Steve Morgan Points 9296

Par la magie de DPAPI:

Cette classe stocke ses données à l'aide du modèle de mémoire protégé par Data Protection API (DPAPI). En d'autres termes, les données sont toujours sous leur forme cryptée tant qu'elles sont stockées à l'intérieur d'un SecureString. La clé de chiffrement est gérée par le sous-système de l'autorité de sécurité locale (LSASS.EXE) et, via l'interface DPAPI, les données peuvent être déchiffrées via une communication interprocessus.

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