web-dev-qa-db-fra.com

Stockage des clés de chiffrement - meilleures pratiques?

J'ai une application Web qui utilise un algorithme de chiffrement symétrique.

Comment stockeriez-vous la clé secrète et le vecteur d'initialisation? Le stockage en tant que littéral dans le code semble être une mauvaise idée. Qu'en est-il des paramètres de l'application? Quelle est la meilleure pratique ici?

59
BC.

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 équivalent .net), et une partie dans la base de données. Obtenir n'importe quelle pièce n'est pas particulièrement difficile si vous êtes compromis, par exemple, en examinant le support de sauvegarde ou l'injection SQL, mais obtenir toutes les pièces nécessitera beaucoup plus de travail.

Vous pouvez diviser une clé en XOR-la 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 souhaitez 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 encoder 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 moyens plus sophistiqués de diviser une clé, par exemple, un algorithme n-sur-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 (cryptage par mot de passe) qui convertissent un mot de passe en une bonne clé symétrique. Vous voulez en trouver un qui nécessite également un fichier externe. Encore une fois, les sauvegardes sur bande ou le mot de passe lui-même ne suffisent pas, vous avez besoin des deux. Vous pouvez également l'utiliser pour diviser le mot de passe en deux parties avec JNDI - vous pouvez utiliser une phrase de passe en texte brut dans JNDI et un fichier d'initialisation quelque part dans le système de fichiers.

Enfin, quoi que vous fassiez, assurez-vous que vous pouvez "retaper" 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 facilite le changement de mot de passe si vous pensez qu'il a été compromis sans nécessiter un rechiffrement massif de toutes les données - il suffit de rechiffrer votre clé réelle.

55
bgiles

Vous est-il possible de saisir un mot de passe de manière interactive au démarrage de l'application? De cette façon, vous n'avez pas besoin de 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".

Sinon, stockez votre clé secrète dans un fichier et modifiez ses autorisations pour la rendre accessible uniquement à l'utilisateur exécutant 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.

Soit dit en passant, un vecteur d'initialisation ne doit être utilisé que pour un seul message. Et les IV ne doivent pas être gardés secrets, vous pouvez donc les stocker n'importe où, mais le stocker avec le seul message qui l'utilise est habituel.

11
erickson

J'ai utilisé une approche où mon application nécessite une clé symétrique lorsqu'elle démarre et la recherche dans un certain fichier. Une fois l'application lancée, je supprime le fichier. Une copie du fichier est conservée à distance pour tout redémarrage requis. Évidemment, cette approche n'est pas viable si votre applciation a des redémarrages fréquents.

Une autre alternative serait un gestionnaire de certificats tel que le magasin de certificats Windows. 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, ce qui nécessiterait un piratage sérieux pour extraire la clé. Votre application pourrait charger son certificat à partir du magasin de certificats et pouvoir appeler des opérations pour signer des demandes ou générer de nouvelles clés symétriques. De plus, vous pouvez attribuer des autorisations à différents magasins de certificats afin que seuls certains comptes privilégiés puissent accéder au certificat.

6
sipwiz

le coller dans le web.config et crypter cette section

Cette SO question parle plus du cryptage web.config

4
roman m

Cela devrait aider ...

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

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

2
JP Alioto