Stockage des clés de cryptage-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? Le stockage comme un littéral dans le code semble être une mauvaise idée. Comment sur les paramètres de l'application? Quelle est la meilleure pratique ici?

59
demandé sur lc. 2009-04-07 03:38:45

5 réponses

une approche standard dans le monde webapp est de diviser la clé et de la mettre à différents endroits. Par exemple, vous pouvez diviser la clé et en mettre 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 n'importe quelle pièce simple n'est pas particulièrement difficile si vous êtes compromis, par exemple, l'examen des supports de sauvegarde ou L'injection SQL, mais obtenir toutes les pièces exigera beaucoup plus de travail.

vous pouvez diviser une clé par XOR-ing 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 morceaux. À la fin du processus vous voulez, par exemple, trois touches partielles telles que p1 ^ p2 ^ P3 = clé. Vous pourriez avoir besoin de base64-Encoder certaines des clés partielles afin qu'elles puissent être stockées correctement, par exemple, dans une propriété JNDI.

(il y a plus des façons sophistiquées de diviser une clé, par exemple, un algorithme n-of-m où vous n'avez pas besoin de toutes les pièces pour recréer la clé, mais c'est-bien au - delà de ce dont vous avez besoin ici.)

si vous pouvez demander à l'utilisateur de saisir 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 souhaitez trouver un seul qui nécessite un fichier externe. Encore une fois c'est un cas les sauvegardes de bande ou le mot de passe lui-même n'est pas assez, vous besoin des deux. Vous pouvez également utiliser ceci pour diviser le mot de passe en deux morceaux avec JNDI - vous pouvez utiliser une phrase de passe en clair dans JNDI et un fichier d'initialisation quelque part dans le système de fichiers.

enfin, quoi que vous fassiez, soyez sûr que vous pouvez 'rekey' votre application assez facilement. Une approche consiste à utiliser le mot de passe obtenu ci-dessus pour déchiffrer un autre fichier qui contient la clé de chiffrement réelle. Cela rend facile de changer le mot de passe si vous pensez qu'il a été compromis sans nécessitant un réencryptage massif de toutes les données-il suffit de réencrypter votre clé réelle.

52
répondu bgiles 2009-04-07 14:37:17

est-il possible pour vous d'entrer un mot de passe de façon interactive chaque fois que l'application démarre? De cette façon, vous n'avez pas à stocker la clé, ou au moins n'importe quelles clés (qu'elles soient symétriques ou privées) peuvent être cryptées avec ce mot de passe "bootstrap".

sinon, stockez votre clé secrète dans un fichier et modifiez ses permissions pour la rendre accessible uniquement à l'utilisateur exécutant l'application web.

ces approches sont la plate-forme agnostique. Pour des suggestions plus concrètes, des informations sur votre plateforme seraient utiles.

Par ailleurs, un vecteur d'initialisation doit être utilisé que pour un seul message. Et les IV n'ont pas été gardées secrètes, donc vous pouvez les stocker n'importe où, mais les stocker avec le seul message qui les utilise est habituel.

10
répondu erickson 2009-04-06 23:47:53

j'ai utilisé une approche où ma demande nécessite une clé symétrique lorsqu'il démarre et recherche 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 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 il est également possible de marquer les clés privées comme étant non exportables, de sorte qu'il faudrait les pirater sérieusement pour en retirer la clé. Votre application pourrait charger son certificat à partir du magasin de certificats et être en mesure d'appeler des opérations pour signer des requêtes ou générer de nouvelles clés symétriques. En outre, vous pouvez attribuer des permissions à différents magasins Certificate de sorte que seuls certains comptes privilégiés seraient en mesure d'accéder au certificat.

5
répondu sipwiz 2009-04-07 00:34:48

le coller dans le web.config et chiffrent cette section

Cela DONC, la question parle plus sur le web.config de chiffrement

4
répondu roman m 2017-05-23 12:32:03

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.

2
répondu JP Alioto 2009-04-06 23:48:13