10
votes

Comment stocker en toute sécurité un fichier privé en code

Je travaille sur un projet logiciel où la demande finira par être exécutée dans un environnement non approuvé. J'ai besoin d'effectuer une certaine signature cryptographique auxiliaire (ce qui n'est pas le moyen principal de sécuriser les données), mais je ne souhaite pas laisser la clé de la vue claire en tant que telle: xxx

Quelle méthode Puis-je utiliser pour assurer cela raisonnablement cela? Je suis conscient que rien n'est une preuve complète, mais cela ajoutera une couche supplémentaire dans le mur de sécurité.

Pour clarification: j'ai ce qui est essentiellement une chaîne que je ne souhaite pas avoir facilement retiré dans un débogueur ou par réflexion. Je suis conscient que la décompilation du fichier de classe pourrait essentiellement rendre cette optique, mais c'est un risque acceptable.

stocker évidemment la clé hors site serait idéal, mais je ne peux pas garantir l'accès à Internet.


4 commentaires

Veuillez élaborer des contraintes et ce que vous entendez par «environnement non approuvé» et «en vue uni».


Vous souciez-vous si une personne définit un point d'arrêt sur Mac.GetInstance () puis trace le code jusqu'à ce qu'ils trouvent votre clé?


Kdgregory, je me soucie mais je ne suis pas sûr qu'il y ait un moyen de le faire.


Après avoir vu votre réponse à mon poste, je pense que le seul suivi est de donner une description plus longue de votre processus d'application et de déploiement. Peut-être que vous pouvez charger la clé de la configuration externe. Sinon, alors je suis d'accord avec kevin que cela ne vaut probablement pas la peine d'appliquer l'objet de l'obFuscation.


5 Réponses :


2
votes

oublier de l'obscurcir dans le code. Cela ne fera que rendre votre logiciel plus difficile à lire, déboguer et à entretenir. Vous serez également cloué si votre logiciel doit passer par un audit de sécurité.

Si vous ne pouvez pas mettre la clé de stockage sécurisé (en toute sécurité sur le disque, la mémoire sécurisée ou une phrase secrète dans la tête de quelqu'un), ne vous embêtez pas avec quoi que ce soit d'autre.

Si vous êtes dans un environnement * Nix, vous stockez la touche sur le disque avec racine / racine 400 Autorisations pourraient être "assez bonnes".

sous Windows, vous pouvez utiliser le DPAPI pour stocker les données de la mémoire sécurisée de Microsofts.

Vous pouvez également utiliser un PBE léger pour chiffrer la clé sensible et avoir l'utilisateur entrer dans la phrase secrète lorsque l'application démarre.


0 commentaires

1
votes

Quelle clé privée est-ce? La clé privée est censée être privée, il est donc faux de le distribuer.


2 commentaires

La clé serait celle que j'ai générée ... Était-ce une vraie question?


C'était une question rhétorique. Signification que si le code n'est pas la propriété de la partie où elle réside, il est faux de l'utiliser.



0
votes

premier off - bon sur vous pour penser à ce problème!

est-il possible de générer une clé privée, de communiquer avec votre autorité de certification et de signer la clé (et de gérer un CRL aussi)?

Autre alternative, si cela va être exécuté sous Windows, vous pouvez utiliser l'API Crypto pour stocker en toute sécurité une clé privée marquée comme non exportable. Comment vous distribuez cette clé de manière sécurisée peut cependant être un autre défi.


1 commentaires

Qu'est-ce qui est si bon à ce sujet? Cela semble le rendre misérable.



5
votes

Il est impossible de sécuriser une clé dans un environnement non approuvé. Vous pouvez obfusquer votre code, vous pouvez créer une clé à partir de variables arbitraires, peu importe. En fin de compte, en supposant que vous utilisiez la bibliothèque standard javax.crypto , vous devez appeler mac.getinstance () , et plus tard, vous appellerez init () sur cette instance. Quelqu'un qui veut que votre clé puisse l'obtenir.

Cependant, je pense que la solution est que vous attachez la clé de l'environnement , pas du programme. Une signature est censée dire que les données proviennent d'une source connue et n'ont pas été altérées depuis cette source qui l'a fourni. Actuellement, vous essayez de dire "garantit que mon programme a produit les données". Au lieu de cela, changez votre besoin de "garantir qu'un utilisateur particulier de mon programme a produit les données". L'ONUS est ensuite déplacé vers cet utilisateur pour prendre soin de sa clé.


1 commentaires

Je suis d'accord avec vos sentiments et votre solution sans réserve. Malheureusement, les contraintes de déploiement ne me permettent pas de changer l'exigence comme vous le décrivez. Dans ce cas, je cherche à éloigner une attaque jusqu'à un niveau de sophistication donné. Si la résistance jusqu'à une personne à moitié qualifiée avec un débogueur est tout ce qui est possible, alors alors soyez-le.



0
votes

Pouvez-vous casser la clé privée en deux parties: stockez une dans votre programme, puis demandez de manière interactive la seconde moitié - lorsque votre application commence?


0 commentaires