2009-03-06 10 views
11

Je développe une application intranet (C#) qui utilise des données (locales au serveur web) que nous aimerions garder privées. Ces données sont cryptées (AES) à l'aide d'un référentiel de données existant. Nous ne pouvons pas totalement empêcher l'accès physique à la machine. De toute évidence, nous n'aurons jamais une sécurité parfaite ici. Cependant, nous voulons rendre aussi difficile que possible l'accès non autorisé aux données.Comment masquer une clé de chiffrement dans une application .NET?

La question est de savoir comment stocker la clé au mieux. Le cryptage basé sur un ID spécifique à une machine est une option, mais cette information serait facilement accessible à quiconque exécutant un outil de diagnostic sur la machine.

Le codage dans l'application est une option (c'est une application unique). Cependant, les assemblys .NET sont assez faciles à décompiler. Alors, serait-il préférable de l'obscurcir, d'utiliser un lanceur de chiffrement, de le compiler?

Ou y at-il une option qui me manque? Pour que nous soyons clairs, je sais que c'est une cause perdue si quelqu'un est déterminé, mais nous cherchons à le rendre aussi dur que possible dans les limites.

Répondre

5

Le cryptage est intégré au système de configuration .NET. Vous pouvez crypter des morceaux de votre fichier app/web.config, y compris où vous stockez votre clé privée.

http://www.dotnetprofessional.com/blog/post/2008/03/03/Encrypt-sections-of-WebConfig-or-AppConfig.aspx

+0

Voici comment je l'ai fait dans le passé. –

+0

Si vous avez accès à la machine, ne pouvez-vous pas écrire une application qui fait référence aux sections cryptées et qui vous donnera le texte en clair? Je pensais que c'était seulement sécurisé si vous n'aviez pas accès à la machine. – user74824

+0

@yahoo: vous avez raison. – NotMe

2

Si quelqu'un peut simplement joindre un débogueur à votre programme, il n'y a absolument rien que vous pouvez faire. Ils n'auront pas à comprendre votre configuration, à démonter votre application, etc. Tout ce qu'ils ont à faire est de lancer l'application - regardez-la avec la clé - bingo.

L'obfuscation n'est d'aucune aide dans ces conditions. La meilleure défense est d'utiliser du matériel pour protéger la clé - qui fera le chiffrement mais ne donnera pas la clé elle-même (et est parfois durci contre des attaques telles que sondant les fils, exposant la mémoire à de basses températures/radiation/d'autres choses nouvelles). IBM fait des choses appropriées (google IBM-4764) mais ce n'est pas bon marché.

3

Parlant dans la terminologie de l'obscurcissement, ce que vous AFTER est appelé cachette constante, à savoir un moyen par lequel vous transformez une constante dans, disons, un certain nombre de fonctions et des calculs qui sont exécutés lors de l'exécution de re-matérialisent ladite constante . Cependant, cela relève toujours du domaine de l'obfuscation, et il est sensible à l'extraction de code, où l'attaquant trace simplement le code correspondant à cette constante et l'exécute dans une application distincte pour récupérer la valeur; ou en vidant la mémoire de l'application au bon endroit afin de la scanner pour la valeur désirée.

Il y a un autre, un peu plus avancé méthode de cacher les clés de chiffrement en particulier, appelée cryptographie boîte blanche, qui emploie chiffrements à clé en générant moins essentiellement une fonction de chiffrement à partir d'une clé donnée, les cuire ensemble. Comme son nom l'indique, cette méthode a été conçue pour être résiliente même dans un scénario d'attaque en boîte blanche (l'attaquant a accès au bytecode et est capable d'inspecter et de manipuler l'exécutable au moment de l'exécution).

Il s'agit de deux méthodes assez avancées pour atteindre la sécurité par l'obscurité, et il pourrait être utile d'envisager d'autres modèles qui ne vous obligent pas à le faire en premier lieu.