2 votes

Java 11 - Comment écraser des informations sensibles dans la mémoire de la JVM ET du système (peut-être en utilisant System.gc() ?)

Problème : Comment écraser de force la mémoire du système en Java ? Plus précisément : Lorsque les clés sont sécurisées, elles ne doivent pas rester plus de quelques secondes dans la mémoire : Ni dans la mémoire de la jvm, ni dans la mémoire de l'OS ?

Ce que j'ai essayé : Modification de l'implémentation du collecteur de déchets java, de sorte qu'il écrase les objets avec des octets aléatoires, au lieu de simplement les libérer. Cependant :

Tout ce que j'ai lu sur System.gc() m'a montré que je ne peux jamais vraiment m'y fier, et qu'il ne faut pas l'utiliser en production. Cependant, que se passe-t-il si je sais que j'utilise une JVM spécifique ? Si je sais que je veux utiliser OpenJDK avec Java 11 et que je configure la JVM pour utiliser une implémentation GC spécifique (pour ne pas laisser la JVM choisir le GC) ?

Question 1 : Est-ce que je peux alors être sûr que System.gc() déclenchera la collecte des déchets 100 fois ?

Question 2 : Puis-je savoir, quel est le durée maximale entre System.gc() a été appelé et le ramassage des ordures va commencer ? C'est une partie importante de la question ! Je n'ai pu trouver que des réponses à l'efficacité de la collecte des déchets elle-même (par exemple, le débit par rapport aux temps de pause de l'arrêt du monde), mais c'est PAS la réponse à cette question. (Je me suis lu tout au long de la documentation ici )

Question 3 : Si l'idée du ramasseur d'ordures modifié est de loin la pire pour écraser en toute sécurité chaque occurrence de divers objets Java sensibles dans la mémoire, alors comment pourrais-je autrement écraser ces objets dans la mémoire ? Est-ce même possible avec Java ? Ce serait bien de pouvoir supprimer et écraser ces objets directement dans le code java, comme on le fait pour libérer des objets en C/C++ ? Existe-t-il d'autres possibilités, peut-être en dehors de Java, où je pourrais écraser chaque occurrence de ces informations sensibles dans la mémoire, ce qui devrait être déclenché aussi instantanément que possible dès que l'objet Java n'est plus utilisé ?

Mes recherches jusqu'à présent :

Comme vous pouvez le constater, ces documents sont, à l'exception des documents officiels, assez anciens :

Question 4 : Existe-t-il de nouvelles perspectives en la matière ? System.gc() se comporte de la même manière qu'il y a 10 ans Merci !

*EDIT : J'utilise déjà des tableaux d'octets pour les cas où ils peuvent être utilisés. La question porte sur des objets Java plus complexes comportant différents champs et propriétés, qui doivent être entièrement nettoyés en mémoire.

4voto

Karol Dowbecki Points 27852

En supposant que vous pouvez stocker la clé de sécurité dans une byte[] ou un autre tableau primitif, il devrait être suffisant de remettre à zéro le tableau après la lecture de la clé :

for (int i = 0; i < key.length; i++) {
  key[i] = 0;
}

Le résultat ci-dessus devrait être byte[] key en étant totalement neutralisé. Se fier à la CG ici serait une erreur car elle est imprévisible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X