web-dev-qa-db-fra.com

Comment cachez-vous les clés secrètes dans le code?

Je me demande depuis quelque temps comment certains logiciels cachent des clés secrètes de telle sorte qu'elles ne peuvent pas être découvertes de manière triviale. Juste quelques exemples:

  • Le logiciel de lecteur de DVD cache les clés CSS
  • Un logiciel avec des numéros de série/codes d'enregistrement masque les clés/hachages utilisés pour valider les numéros de série

Évidemment, ces programmes font plus que simplement avoir la clé dans un octet [], car cela leur permettrait de voler facilement leurs clés et de générer leurs propres numéros de série, etc.

Quelles sortes de stratégies sont utilisées pour cacher ces clés afin qu’elles ne puissent pas être retrouvées facilement?

42
TTar

La raison pour laquelle ces clés secrètes ont été si facilement découvertes est qu’elles étaient cachées dans un logiciel.

Évitez à tout prix de cacher des secrets dans les logiciels - l'obscurcissement ne vous mènera que jusque-là. Posez-vous la question suivante: Dans quelle mesure puis-je cacher une clé de logiciel à une personne ayant un accès complet aux débogueurs de désassemblage, de mode utilisateur et de mode noyau, et sans travail quotidien? Ce n'est qu'une question de temps avant qu'il ne soit fissuré.

35
Michael

Il vous suffit de cacher la clé quelque part et de la déchiffrer lorsque vous en avez besoin. Utiliser la clé "en toute sécurité" est la partie compliquée. Les crackers peuvent définir un point d'arrêt à l'endroit où vous utilisez la clé déchiffrée et la vider. Ils peuvent analyser votre code pour rechercher des modèles qui indiquent que vous utilisez un algorithme de cryptage connu (la plupart des algorithmes ont des tables précalculées). etc. 

C'est pourquoi vous devez rendre l'ensemble du logiciel exécutable difficile à analyser. Pour cela, vous utilisez des programmes d’exécution exécutables, l’exécution de code sur une machine virtuelle, des contrôles d’intégrité, etc. Tout ceci consiste à ralentir le débogage et la modification de votre code.

Comme la plupart des gens le soulignent, vous ne pouvez arrêter personne, mais simplement le ralentir. Je voudrais aller à un forum de cracker et demander des suggestions de problèmes de dissimulation clés. Ils sont probablement utiles si vous demandez gentiment.

ps. La crypto à clé publique ne cachera pas mieux la clé, mais cela pourrait rendre plus difficile (ou théoriquement impossible) de créer un générateur de clé, si vous utilisez un système de licence.

13
John Smith

En bout de ligne, vous ne pouvez pas. Voir tout autre commentaire ici pour les raisons. Même un logiciel de chiffrement tel que PGP/GPG stocke les clés dans un fichier, puis demande instamment que ces fichiers soient conservés sur une clé USB dans un coffre-fort ou quelque chose d'autre. Les clés stockées dans le code exécutable seront découvertes.

En fait, si vous essayez de chiffrer quelque chose sur un ordinateur client qui sera déchiffré par le client dans le cadre d'opérations normales, c'est aussi une course du pote. Les machines clientes sont intrinsèquement peu sûres et vous ne pouvez pas contrôler ce qu'elles vont pouvoir faire pour vos données.

Si vous essayez de vous authentifier, examinez plutôt l'authentification basée sur Internet avec des connexions à un serveur, ou une sorte de KeyCode généré utilisé pour valider le logiciel.

Les clés secrètes faisant partie d'une paire de clés publique-privée doivent être conservées dans des fichiers de données pouvant être sécurisés. Les clés symétriques doivent être générées à la volée en tant que clés de session, puis supprimées. Supposez toujours que toute personne possédant une clé secrète ou une clé de session sur votre ordinateur sera en mesure de la découvrir et l’utilisera à l’encontre de vos intentions.

Lisez " Applied Cryptography " de Bruce Schneier pour plus d'informations.

6
Furious Coder

Vous ne pouvez pas cacher une clé pour toujours. Mais vous pouvez certainement rendre la recherche difficile. Certaines approches consistent à chiffrer la clé en mémoire, à conserver plusieurs copies (éventuellement cryptées différemment) vérifiées les unes par rapport aux autres, à laisser des copies factices accessibles, à stocker la clé dans un format bizarre, etc. Aucune ne fonctionnera si quelqu'un veut votre clé, mais vous pouvez au moins dissuader un attaquant occasionnel/inexpérimenté.

5
Promit

Lorsque nous avons commencé à développer notre logiciel, nous avons créé un fichier de licence daté. Ensuite, nous avons réalisé que peu de gens sont même intéressés à acheter notre logiciel. Ensuite, nous avons décidé de le donner gratuitement. Beaucoup plus de gens ont commencé à se soucier au moins d'essayer notre chef-d'œuvre. Enfin, nous avons open source notre logiciel. Beaucoup plus d'utilisateurs ont commencé à l'utiliser. Nous espérons maintenant qu'un petit nombre de ces utilisateurs deviendront des clients payants (c'est-à-dire qu'ils achètent un support technique ou demandent une personnalisation).

En bout de ligne, si quelqu'un veut pirater votre logiciel, il le fera quand même. Vaut-il vraiment la peine de perdre votre temps à essayer de le protéger avec cette clé secrète cachée? 

2
Yakov Fain

Vous n'avez pas toujours besoin d'une clé pour valider une licence. 

Mais en ignorant ce fait, votre clé peut également être le résultat d'une autre fonction. Vous ne stockez pas réellement une valeur de clé spécifique, vous avez plutôt une fonction qui génère la clé à la volée (toujours le même résultat). Bien que ce ne soit pas impossible, c'est beaucoup plus difficile à trouver puisque vous ne recherchez plus une valeur, mais vous devez comprendre que c'est une équation.

1
Stephane Grenier

Si vous pouvez vous le permettre, le mieux est de stocker la clé privée dans un jeton USB cryptographique. La clé est en écriture uniquement, c’est-à-dire que vous pouvez la définir mais pas la lire. Le jeton effectue les opérations cryptographiques en interne, dans son matériel. Il devient très compliqué de récupérer la clé (si le jeton ne présente aucune vulnérabilité connue, ce qui n’est pas le cas des anciennes).

1
galinette

Masquer les clés secrètes dans le code ne sera pas vraiment sécurisé. Comme vous l'avez peut-être remarqué, les DVD et la plupart des enregistrements de numéros de série de logiciels sont piratés quotidiennement. Si vous voulez vraiment sécuriser quelque chose, vous devez utiliser le cryptage à clé publique.

0
Adam Berent

Vous ne pouvez pas, c'est impossible. Tout attaquant ayant accès à la machine cible pourrait désassembler votre code pour le trouver, ou trouver le fichier de clé sur la machine cible, etc.

Le SEUL moyen de s’assurer que la clé de chiffrement est sécurisée est de la saisir manuellement par l’utilisateur lorsque cela est nécessaire.

0
FNG