J'écris un logiciel où je dois crypter tous les fichiers qui sont écrits dans un dossier spécifique en utilisant AES. Il y a un mot de passe/clé qui est configuré quelque part, qui est toujours utilisé.
Je ne veux pas stocker une chaîne base64 car c'est trop compliqué pour la personne qui pourrait avoir à changer la configuration. Je souhaite stocker une chaîne contenant des caractères. Quelle est la meilleure façon de convertir ce mot de passe en une clé à utiliser dans AES?
Si je comprends bien, je dois également fournir un sel. Cependant, dans ma situation, le sel semble inutile car je n'ai qu'une seule clé.
Ce que vous faites est le suivant:
Donc:
hash(hash(password)) --> can be stored
hash(password) --> cannot be stored
Vous devez toujours fournir un sel même si vous n'avez qu'une seule clé (cela empêche en grande partie les recherches de table Rainbow). Heureusement pour vous, la génération de sel se fait automatiquement par PBKDF2.
Donc au final, vous avez en fait 3 choses:
Vous pourriez vous demander pourquoi vous avez besoin de la clé: si vous changez votre mot de passe (et que vous avez chiffré tous vos fichiers avec votre mot de passe), vous devez d'abord déchiffrer tous vos fichiers avec votre mot de passe d'origine, puis les rechiffrer avec votre nouveau mot de passe. Avec cette implémentation, tout ce que vous devez faire est de décrypter et rechiffrer la clé (car cette clé sert de mot de passe).
[~ # ~] modifier [~ # ~]
J'ai en quelque sorte mal interprété votre question, j'ai ajouté la fonction de dérivation des clés.
Aussi ne bonne lecture (avec l'aimable autorisation d'IBM)
Pour convertir un mot de passe en clé AES, PBKDF2 est le moyen le plus simple de le gérer. Assurez-vous simplement que le mot de passe a suffisamment entropie .
Vous faites devez utiliser un sel, car il est là pour vous protéger contre les attaques de la table Rainbow.
Selon votre plate-forme, il peut déjà y avoir des bibliothèques disponibles pour vous aider. Sinon, je recommanderais quelque chose de proche de la solution de Lucus Kaufman.
Ne stockez k2 nulle part. Ne stockez pas k1 non chiffré. Faire l'une de ces choses va briser la sécurité de votre système.
Si vous ne vous souciez pas de pouvoir changer votre mot de passe (je considérerais cela comme une fonctionnalité très importante, mais peut-être pas), alors vous pouvez ignorer les étapes impliquant k1 et utiliser k2 comme clé AES et k3 pour vérifiez-le.
Vous pouvez également trouver utile de générer une autre clé pour HMAC , afin de pouvoir vérifier que les fichiers cryptés n'ont pas été falsifiés. Si vous souhaitez le faire, vous pouvez générer une clé HMAC 128 bits, puis la chiffrer et la stocker avec la clé AES principale.
Si vous générez une clé, vous devez en quelque sorte la hacher, étant donné qu'une fonction de hachage est "en quelque sorte" comme un pseudo-rng. Donc, utiliser PBKDF2 est toujours bon, car c'est une méthode de dérivation de clé et est utilisée spécifiquement à cette fin. Vous transmettez un mot de passe et il génère une clé que vous pouvez utiliser en fonction de votre mot de passe et d'un sel. En ce qui concerne Salt, il fait automatiquement partie de PBKDF2, vous ne devriez donc pas vous en soucier.
Si vous utilisez quelque chose comme .NET et stockez la clé dans votre fichier web.config, vous pouvez crypter des parties de votre web.config avec la clé machine ou une clé RSA http://msdn.Microsoft.com/en -us/library/dtkwfdky% 28v = vs.100% 29.aspx , la bonne chose à ce sujet est que Windows se chargera de stocker la clé RSA et/ou la clé machine. Vous pouvez même automatiser ce processus avec votre serveur de build.