72 votes

Stockage des clés de chiffrement : les meilleures pratiques ?

J'ai une application web qui utilise un algorithme de cryptage symétrique.

Comment stocker la clé secrète et le vecteur d'initialisation ? Stocker comme un littéral dans le code semble être une mauvaise idée. Et les paramètres de l'application ? Quelle est la meilleure pratique ici ?

4 votes

Il ne s'agit pas d'une question triviale. Vous pouvez consulter ce résumé rédigé par plusieurs experts en sécurité pour mettre cette question en perspective : schneier.com/papier-key-escrow.html

62voto

bgiles Points 663

Une approche standard dans le monde des applications Web consiste à diviser la clé et à la placer à différents endroits. Par exemple, vous pouvez diviser la clé et en placer une partie dans le système de fichiers (en dehors du répertoire 'webapps'), une partie dans la configuration JNDI (ou l'équivalent .net), et une partie dans la base de données. Obtenir un seul élément n'est pas particulièrement difficile si vous êtes compromis, par exemple en examinant les supports de sauvegarde ou par injection SQL, mais obtenir tous les éléments demandera beaucoup plus de travail.

Vous pouvez diviser une clé en la soumettant à une opération XOR avec des nombres aléatoires de même taille. (Utilisez un générateur de nombres aléatoires cryptographiquement fort !) Vous pouvez répéter ce processus plusieurs fois si vous voulez diviser la clé en plusieurs morceaux. À la fin du processus, vous voulez, par exemple, trois clés partielles telles que p1 ^ p2 ^ p3 = clé. Vous devrez peut-être coder en base64 certaines des clés partielles pour qu'elles puissent être stockées correctement, par exemple dans une propriété JNDI.

(Il existe des moyens plus sophistiqués de diviser une clé, par exemple un algorithme n-de-m où vous n'avez pas besoin de toutes les pièces pour recréer la clé, mais c'est -largement- au-delà de ce dont vous avez besoin ici).

Si vous pouvez exiger de l'utilisateur qu'il saisisse activement le mot de passe, il existe des algorithmes PBE (password-based encryption) qui convertissent un mot de passe en une bonne clé symétrique. Vous devez en trouver un qui nécessite également un fichier externe. Là encore, les sauvegardes sur bande ou le mot de passe lui-même ne suffisent pas, il faut les deux. Vous pourriez également utiliser ceci pour diviser le mot de passe en deux parties avec JNDI - vous pouvez utiliser une phrase de passe en texte clair dans JNDI et un fichier d'initialisation quelque part dans le système de fichiers.

Enfin, quoi que vous fassiez, assurez-vous de pouvoir "recoder" votre application assez facilement. Une approche consiste à utiliser le mot de passe obtenu ci-dessus pour déchiffrer un autre fichier qui contient la véritable clé de chiffrement. Cela permet de changer facilement le mot de passe si vous pensez qu'il a été compromis sans nécessiter un nouveau chiffrement massif de toutes les données - il suffit de rechiffrer votre clé réelle.

12voto

erickson Points 127945

Est-il possible d'entrer un mot de passe de manière interactive à chaque fois que l'application démarre ? De cette façon, vous n'auriez pas à stocker la clé, ou du moins toutes les clés (qu'elles soient symétriques ou privées) pourraient être cryptées avec ce mot de passe "bootstrap".

Sinon, stockez votre clé secrète dans un fichier à part et modifiez ses autorisations pour qu'elle ne soit accessible qu'à l'utilisateur qui exécute l'application web.

Ces approches sont indépendantes de la plate-forme. Pour des suggestions plus concrètes, des informations sur votre plateforme seraient utiles.

Au fait, un vecteur d'initialisation ne doit être utilisé que pour un seul message. Les IV n'ont pas à être tenus secrets, vous pouvez donc les stocker n'importe où, mais il est d'usage de les stocker avec le seul message qui les utilise.

0 votes

@BC Voici un RFC sur la cryptographie basée sur les mots de passe qui pourrait être intéressant, mais ils sont un peu étouffants à lire : ietf.org/rfc/rfc2898.txt @erickson LOL vous avez votre clé publique dans votre bloc "à propos de moi".

0 votes

Sur une note non technique... pour le rendre encore plus sûr, le mot de passe saisi de manière interactive doit être choisi ou distribué à deux (ou plus) personnes ou lieux physiques. Ainsi, aucune personne ne connaîtra le mot de passe. Ceci est utile dans les situations où vous pensez que l'ingénierie sociale / la corruption / la subornation est une considération.

6voto

sipwiz Points 15291

J'ai utilisé une approche où mon application requiert une clé symétrique au démarrage et la cherche dans un certain fichier. Une fois que l'application a démarré, je supprime le fichier. Une copie du fichier est conservée à distance pour tout redémarrage nécessaire. Évidemment, cette approche n'est pas viable si votre application doit être redémarrée fréquemment.

Une autre alternative serait un gestionnaire de certificats tel que le Windows Certificate Store. Il peut stocker les certificats et leurs clés en toute sécurité et il est également possible de marquer les clés privées comme non exportables, de sorte qu'il faudrait un piratage sérieux pour extraire la clé. Votre application pourrait charger son certificat depuis le magasin de certificats et être en mesure d'appeler des opérations pour signer des demandes ou générer de nouvelles clés symétriques. En outre, vous pouvez attribuer des permissions à différents magasins de certificats afin que seuls certains comptes privilégiés puissent accéder au certificat.

1 votes

"Conservé à distance" où ? Pouvez-vous expliquer pourquoi cela rend le système plus sûr ?

0 votes

"Une copie du fichier est conservée à distance pour tout redémarrage nécessaire" Pouvez-vous préciser ce point ?

4voto

roman m Points 9998

Le mettre dans le web.config et crypter cette section

Cette question de l'OS Pour en savoir plus sur le cryptage web.config

19 votes

Si vous cryptez le web.config, où allez-vous stocker la clé pour décrypter le web.config ?

2voto

JP Alioto Points 33482

Cela devrait aider ...

http://msdn.microsoft.com/en-us/library/ms998280.aspx

Mais vous devriez vraiment envisager de passer à la PKI si vous voulez vraiment protéger vos données.

1 votes

Lorsque vous utilisez une ICP, comment et où stockez-vous la clé privée ?

5 votes

Exactement ! Vous avez toujours un problème de stockage des clés, que vous utilisiez l'ICP ou le chiffrement par clé symétrique. L'ICP ne constitue donc pas une meilleure solution lorsque le même système ou la même partie doit crypter et décrypter les données.

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