web-dev-qa-db-fra.com

L'affectation de clés déchiffrées à une variable dans l'application est-elle sécurisée?

Disons que j'ai récupéré une clé secrète cryptée sur le serveur. Je le déchiffre pour obtenir la clé secrète réelle, attribue la clé déchiffrée à une variable dans mon application. Quelque chose le long de cela:

const encryptedKey = fetchKeyFromServer();
const secretKey = decrypt(encryptedKey);
//Now, the variable secretKey has the actual secret key in memory

Maintenant, est-ce une chose vulnérable à faire en termes de sécurité? Étant donné que j'ai stocké la clé déchiffrée dans la mémoire, y a-t-il une chance que quelqu'un puisse révéler la clé secrète en lisant dans la mémoire de l'application?

Cependant, si je n'attribue pas la clé déchiffrée à une variable, comment dois-je utiliser la clé? J'ai pensé à affecter la clé cryptée à la variable et à la décrypter chaque fois que je dois l'utiliser. Mais je ne sais toujours pas si c'est la meilleure façon de faire les choses.

22
xenon

Oui, cela signifie que la clé sera stockée dans la mémoire de l'application. Oui, il existe un risque que des logiciels malveillants (avec des privilèges suffisants) puissent les lire à partir de là. Ce risque est difficile à éviter - si vous souhaitez utiliser la clé, vous devez la mettre en mémoire, tout comme vous devez mettre votre clé de maison dans votre poche après avoir verrouillé la porte.

Cela n'est généralement pas considéré comme un gros problème pour une raison: s'il y a un malware avec des privilèges root sur un ordinateur, il est déjà de toute façon en cours de jeu. Il n'y a aucun moyen de protéger quoi que ce soit à ce stade. Même si vous ne déchiffrez pas la clé, le logiciel malveillant pourrait simplement lire la clé utilisée pour ce déchiffrement où qu'elle soit stockée.

Voici trois choses que vous pouvez faire pour atténuer le risque:

  • Utilisez une sorte de HSM . (Merci à DRF pour l'avoir signalé.) C'est la meilleure approche, mais la faisabilité dépend de la plateforme sur laquelle vous travaillez. Notez cependant que les logiciels malveillants disposant de privilèges suffisants pour lire la mémoire d'autres processus peuvent également utiliser le HSM. Ce n'est donc pas à l'épreuve des balles contre une infection par un malware.
  • Réduisez le temps que la clé est en mémoire pour réduire la fenêtre d'attaque en écrasant la mémoire une fois que vous avez terminé. (Comme MSalters le fait remarquer, cela peut ne pas être aussi simple qu'il y paraît. Par exemple, en C++, l'optimiseur peut supprimer une écriture qui n'est pas lue, et dans Java les chaînes sont immuables et ne peuvent donc pas être écrasées.)
  • Comme Vitor le suggère, marquez la page mémoire sur laquelle la clé est stockée comme non échangeable afin qu'elle ne soit jamais écrite sur le disque.
32
Anders