2009-04-06 7 views
57

J'ai une application web qui utilise un algorithme de chiffrement symétrique.Stockage des clés de chiffrement - meilleures pratiques?

Comment stockez-vous la clé secrète et le vecteur d'initialisation? Stocker comme un littéral dans le code semble être une mauvaise idée. Que diriez-vous des paramètres d'application? Quelle est la meilleure pratique ici?

+2

Ce n'est pas une question triviale. Vous pourriez vouloir examiner ce résumé par plusieurs experts en sécurité pour mettre cette question en perspective: http://www.schneier.com/paper-key-escrow.html –

Répondre

52

Une approche standard dans le monde webapp consiste à diviser la clé et à la placer à différents endroits. Par exemple, vous pourriez diviser la clé et en mettre une partie dans le système de fichiers (en dehors du répertoire 'webapps'), une partie de celle-ci dans la configuration JNDI (ou équivalent .net) et une partie dans la base de données. Obtenir une seule pièce n'est pas particulièrement difficile si vous êtes compromis, par exemple en examinant un support de sauvegarde ou une injection SQL, mais obtenir toutes les pièces nécessitera beaucoup plus de travail.

Vous pouvez diviser une clé en la tapant XOR avec des nombres aléatoires de la 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 parties. A 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 afin qu'elles puissent être stockées correctement, par exemple, dans une propriété JNDI.

(Il existe des méthodes plus sophistiquées pour fractionner une clé, par exemple un algorithme n-of-m dans lequel vous n'avez pas besoin de toutes les pièces pour recréer la clé, mais cela dépasse ce dont vous avez besoin ici.

Si vous pouvez demander à l'utilisateur d'entrer activement le mot de passe, il existe des algorithmes PBE (mot de passe à base de mots de passe) qui convertissent un mot de passe en une bonne clé symétrique. Vous voulez en trouver un qui nécessite un fichier externe. Encore une fois, les sauvegardes sur bande ou le mot de passe ne suffisent pas, vous avez besoin des deux. Vous pouvez également utiliser ceci pour diviser le mot de passe en deux parties avec JNDI - vous pouvez utiliser une phrase secrète en texte brut dans JNDI et un fichier d'initialisation quelque part dans le système de fichiers. Enfin, quoi que vous fassiez, soyez sûr de pouvoir "re-jouer" votre application assez facilement. Une approche consiste à utiliser le mot de passe obtenu ci-dessus pour déchiffrer un autre fichier contenant la clé de chiffrement réelle. Cela facilite le changement du mot de passe si vous pensez qu'il a été compromis sans nécessiter un recencryptage massif de toutes les données - il vous suffit de rechiffrer votre clé actuelle.

4

bâton dans le web.config et encrypt that section

This SO question parle plus sur le cryptage web.config

+9

si vous cryptez le web.config, où allez-vous stocker ils clé pour décrypter le web.config? – Kirby

+24

Il y a des tortues tout le long ... – mwolfe02

10

Est-il possible pour vous d'entrer un mot de passe de manière interactive chaque fois que l'application démarre? De cette façon, vous n'avez pas à stocker la clé, ou au moins toutes les clés (qu'elles soient symétriques ou privées) peuvent être cryptées avec ce mot de passe "bootstrap". Si ce n'est pas le cas, stockez votre clé secrète dans un fichier et modifiez ses autorisations pour la rendre accessible uniquement à 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 plate-forme seraient utiles. Par ailleurs, un vecteur d'initialisation doit être utilisé pour un seul message. Et les IVs n'ont pas été gardés secrets, donc vous pouvez les stocker n'importe où, mais le stocker avec le seul message qui l'utilise est habituel.

+0

@BC Voici une RFC sur la cryptographie basée sur un mot de passe qui pourrait être intéressante, mais elles sont un peu étouffantes à lire: http://www.ietf.org/rfc/rfc2898.txt @erickson LOL vous avez votre clé publique dans votre bloc à propos de moi. – AaronLS

+0

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

2

Cela devrait aider ...

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

Mais, vous devriez vraiment envisager d'aller à l'ICP si vous êtes sérieux au sujet de la protection de vos données.

+1

Lors de l'utilisation de PKI, comment et où stockez-vous la clé privée? – Dan

+3

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

5

J'ai utilisé une approche où mon application nécessite une clé symétrique quand elle démarre et la recherche dans un certain fichier. Une fois l'application démarrée, je supprime le fichier. Une copie du fichier est conservée à distance pour tous les redémarrages requis. Évidemment, cette approche n'est pas viable si votre application a des redémarrages fréquents. Une autre alternative serait un gestionnaire de certificats tel que le magasin de certificats Windows. Il peut stocker des certificats et leurs clés en toute sécurité et il est également possible de marquer les clés privées comme non exportables, ce qui nécessite un piratage sérieux pour obtenir la clé. Votre application peut charger son certificat à partir du magasin de certificats et être capable 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 autorisations à différents magasins certifcate afin que seuls certains comptes privilégiés puissent accéder au certificat.

+0

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

+0

"Une copie du fichier est conservée à distance pour tous les redémarrages nécessaires" Pouvez-vous élaborer sur ce point? –