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:
- Les documents Java officiels pour Java 11
- Forcer la machine virtuelle Java à exécuter garbage collector [dupliquer] à partir de 2013
- Quand le système.gc () faire n'importe quoi à partir de 2008
- Système.gc () pour la collecte des ordures à partir de 2013
- Qu'est-ce que le système.gc () garanties à faire? [dupliquer] de 2013
- Fait appel au système.gc() en java suggérer la collecte des ordures de la génération titulaire ainsi que de la jeune génération?, à partir de 2010
- Pourquoi est-ce une mauvaise pratique d'appeler le système.gc ()?, à partir de 2010
- Comment forcer la récupération de place en Java?, à partir de 2009
- Existe-t-il un destructeur pour Java? à partir de 2008
- Appeler explicitement le système.gc () dans le code [duplicate] de 2016
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.
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.