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


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

Ce que j'ai essayé: Modifier l'implémentation du garbage-collector java, de sorte qu'il écraserait à coup sûr 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 peux ne comptez jamais vraiment dessus, et que l'on ne devrait pas l'utiliser en production. Cependant, que faire si je sais que j'utilise une JVM spécifique? Que faire 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: Puis-je alors être sûr que System.gc() déclenchera la collecte des ordures 100% fois?

Question 2: Puis-je savoir, quelle est la durée maximale entre System.gc() a été appelé et la collecte des ordures réelle 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 ordures elle-même (par exemple, le débit vs les temps de pause d'arrêt du monde), mais ce n'est PAS la réponse à cette question. (Lisez moi - même toute la documentation ici)

Question 3: Si l'idée avec le garbage collector modifié est de loin la pire idée d'é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, similaire à la libération d'objets en C/C++? Existe-t-il d'autres possibilités en dehors de java où je peux écraser chaque occurrence de telles informations sensibles dans la mémoire, qui devraient être déclenchées aussi instantanément que possible dès que l'objet java n'est pas plus longtemps utilisé?

Mes recherches jusqu'à présent:

Comme vous pouvez le voir, ceux-ci sont, à l'exception des documents officiels, assez anciens, donc:

Question 4: Existe-t-il des informations plus récentes sur la question de savoir si System.gc() se comporte de la même manière qu'il y a 10 ans?? Merci!

*MODIFIER: J'utilise déjà des tableaux d'octets pour les cas où ceux-ci peuvent être utilisés. La question concerne des objets Java plus complexes avec divers champs et propriétés différents, qui doivent être nettoyés complètement dans la mémoire.

Author: ElectRocnic, 2018-12-14

1 answers

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

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

Ci-dessus devrait entraîner la suppression complète de byte[] key. S'appuyer sur GC ici serait une erreur car il est imprévisible.

 4
Author: Karol Dowbecki, 2018-12-14 13:35:49