2011-03-30 1 views
5

J'écris des logiciels qui traitent diverses informations sensibles telles que les adresses e-mail, les mots de passe et les numéros de cartes de crédit.Données sensibles dans les décharges de tas java

Lorsque nous avons des problèmes de mémoire, il serait bien que l'application écrive un vidage de tas. Le problème est que la pile de tas peut contenir des informations sensibles en texte brut si un thread fonctionne dans la zone ... nous ne voulons pas vraiment que cela soit écrit sur le disque quand nous prenons tellement de peine à le chiffrer partout ailleurs.

Existe-t-il un moyen de gérer cela, par exemple en demandant à la JVM d'écrire une image chiffrée?

+0

wow, je serais intéressé de voir s'il y a une solution - c'est cher et boiteux, mais crypter tout dans vos objets – somid3

+1

toute personne avec un accès root peut obtenir le vidage et/ou modifier l'application. Donc, je ne vois pas vraiment de raison de chiffrer quoi que ce soit. Vous pouvez obtenir le vidage de tas w/jmap de n'importe quel processus Java. – bestsss

Répondre

1

La réponse courte n'est pas complètement. À un certain moment, vous devez avoir les données en clair pour l'utiliser et dans les machines virtuelles collectées par les ordures, vous ne pouvez pas contrôler quand les objets sont physiquement retirés de la mémoire. La seule véritable stratégie pour minimiser les risques consiste à supprimer toutes les références aux données confidentielles non cryptées le plus rapidement possible. Cela ne garantira pas qu'aucune donnée confidentielle ne sera écrite dans une mémoire, mais si quelqu'un peut le faire, alors ils peuvent déjà accéder à l'information critique.

+4

Mais assurez-vous de nuke la zone de mémoire avant de le renvoyer! (Ainsi, ne stockez jamais les mots de passe dans les objets 'String', mais utilisez' char [] 'à la place.) –

+0

Sur une note connexe, j'ai dû faire des choses dans le passé comme accepter le mot de passe d'un utilisateur, puis le passer à Appel WS, mais JAXB n'a aucun moyen d'utiliser un tableau d'octets pour passer une valeur de chaîne. Est-ce que quelqu'un sait un moyen de contourner cela? –

+1

@Chris, "nuking" de la mémoire dans Java ne fonctionne pas. Le garbage collector est libre de copier le contenu à tout moment, donc vous resterez avec un objet non-nuked. La seule chose que vous pouvez faire est d'utiliser DirectCharacterBuffers, pas char [], utilisez simplement un gros buffer et découpez-le puisque les buffers directs prennent au moins une page en mémoire. Et pour aggraver les choses, vous devez effacer toutes les traces, y compris les tampons socket. Dans l'ensemble, c'est un effort inutile. – bestsss

3

J'ai envisagé de gérer cela à l'extérieur si le VM. Une approche naïve pourrait consister à demander à jvm d'écrire le vidage sur un périphérique de bouclage chiffré. Bien sûr, ce n'est pas totalement sécurisé car n'importe qui avec un accès root peut accéder au point de montage, mais c'est le genre de solution que j'attends. Je pourrais voir si je peux mettre en place un FIFO que le jvm finit par écrire. Je connais le nom de fichier que le VM utilisera, donc cela pourrait fonctionner en fonction de la manière dont vm s'y adapterait (plus tard: cela ne fonctionne pas.) La JVM se plaint de "Fichier existe")

L'utilisation de tableaux de char atténue seulement le problème, mais il est toujours possible que le tableau contienne du texte brut au moment du vidage.

+0

+1 pour le périphérique à boucle cryptée – Daniel

+1

Si vous vous inscrivez, vous auriez obtenu le représentant sur un compte. – Daniel

+0

Même si vous ne le faites pas, les données sont toujours conservées en tant qu'objet de segment géré à un moment donné. Je ne suis pas sûr que le point de rendements décroissants est dans la réduction des risques. – Jeremy

Questions connexes