web-dev-qa-db-fra.com

Suppression d'un objet Java en toute sécurité

Je sais que pour supprimer un Java, je devrais utiliser un tableau de caractères au lieu de String, car je peux effacer en toute sécurité (réécrire le tableau de caractères avec d'autres données) son contenu. Cela ne semble pas être faisable pour les objets String.

Maintenant, sur BlackBerry qui est Java, je n'ai pas pu trouver une API pour gérer les données comme un tableau de caractères mais je suis obligé d'utiliser String. Ainsi ma question, au cas où je stocke un mot de passe dans un objet, comment puis-je le supprimer en toute sécurité?

33
smiley

En fait, vous ne pouvez pas vraiment "effacer en toute sécurité" un tableau de caractères en Java. Java fait l'allocation de mémoire via un garbage collector , un logiciel délicat qui, en pratique, déplacera les objets mémoire en physique RAM = sur une base régulière. Donc ce que vous pensez être "un char[] instance "sera copié à plusieurs endroits et l'effacement ne se produira physiquement qu'à l'un de ces endroits.

Dans ce contexte, la "suppression sécurisée" ne peut pas vraiment exister en Java. Si vous utilisez Java, vous devez vous assurer que le contexte d'utilisation est tel qu'une suppression sécurisée n'est pas nécessaire: la "suppression sécurisée" est nécessaire principalement lorsque le système d'exploitation peut allouer des blocs non mis à zéro RAM (donc une application peut obtenir des extraits de l'ancien RAM d'autres applications), ou en présence de mémoire virtuelle (des parties du RAM étant copiées sur un disque dur). I suppose que ceux-ci ne s'appliquent pas à un BlackBerry, donc les instances simples de String devraient être correctes.

Une autre façon de le dire est que si les instances de String ne sont pas correctes pour les mots de passe, alors vous avez des problèmes de sécurité plus importants que la simple fuite de mot de passe . Après tout, vous utilisez un mot de passe pour protéger l'accès à certaines données, donc si vous avez besoin d'un "effacement sécurisé" pour un mot de passe, alors, tout à fait logiquement, vous auriez également besoin d'un "effacement sécurisé" pour les données protégées, et tout ce que vous faites avec ça.

(On peut deviner que je ne suis pas un grand fan du concept d '"effacement sécurisé".)

43
Thomas Pornin

dans le cas où je stocke un mot de passe dans un objet, comment puis-je le supprimer en toute sécurité?

Je pense que vous voulez dire; comment empêcher un attaquant ayant accès à l'appareil de récupérer le mot de passe?

Cela dépend du niveau d'accès que l'attaquant a obtenu.

Si l'attaquant est limité à l'API externe que vous fournissez (ce n'est pas une bonne hypothèse), le contrôle d'accès utilisant Java.security.AccessController devrait suffire. Si vous concevez correctement vos contrôles d'accès (très difficile à faire) et que l'attaquant ne peut pas contourner les contrôles d'accès, le contrôle d'accès empêchera l'attaquant d'obtenir les données.

Si l'attaquant est limité à opérer dans la machine virtuelle Java mais pas votre API, vous devez protéger les données avec KeyStore.PrivateKeyEntry. À ce niveau, vous ne pouvez pas compter sur le bon fonctionnement de votre conception pour protéger les données et vous devez compter sur la machine virtuelle Java pour assurer la protection.

Si l'attaquant est limité au système d'exploitation (et non à la machine virtuelle Java virtuelle), vous ne pouvez pas protéger vos données. Si l'attaquant peut empêcher le Java Virtual la machine de fonctionner comme prévu, l'attaquant peut contourner tout mécanisme de sécurité Java.

Si l'attaquant a un accès physique à l'appareil, il est impossible de protéger les données contre toutes les attaques. À ce niveau, l'attaquant peut lire les données en cours d'écriture sur la RAM, le flash, les modules matériels, etc.

6
this.josh