web-dev-qa-db-fra.com

Comment puis-je convertir en toute sécurité un mot de passe "chaîne" en une clé utilisée dans AES?

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?

  • Puis-je simplement obtenir les octets de la clé?
  • Dois-je générer une clé à l'aide de PBKDF2?

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é.

  • Dois-je simplement fournir un sel vide ou n'est-ce pas en quelque sorte sûr?
  • Ou existe-t-il une manière complètement différente (si tout va bien plus simple)?
23
Matthijs Wessels

Ce que vous faites est le suivant:

  • Générez une clé longue (ce ne sont que des données sécurisées générées de manière aléatoire, vous pouvez utiliser 128 bits)
  • Vous utilisez cette clé pour crypter votre fichier avec AES (ce qui signifie que vous l'utilisez comme mot de passe)
  • Vous cryptez la clé elle-même avec AES en utilisant votre mot de passe (qui est un peu plus court mais plus facile à retenir. Maintenant, AES exige à nouveau que ce soit 128, 192 ou 256 bits de longueur, vous devez donc créer votre mot de passe de cette longueur. Par conséquent, vous peut simplement utiliser PBKDF2 (ou scrypt ou bcrypt) pour créer une longueur de clé fixe à partir de votre mot de passe. NE PAS STOCKER CECI.
  • Vous conservez un hachage de votre mot de passe haché à l'aide de PBKDF2 (ou bcrypt ou scrypt). Cela vous permettra de vérifier si le mot de passe est correct avant d'essayer de décrypter votre clé cryptée.

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:

  • Vos fichiers cryptés
  • Votre clé cryptée
  • Un hachage de votre mot de passe pour le vérifier

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)

36
Lucas Kauffman

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.

Installer:

  1. Générez une clé aléatoire de 128 bits (k1), une clé aléatoire de 128 bits IV et une aléatoire salt (64 bits est probablement suffisant).
  2. Utilisez PBKDF2 pour générer une clé de 256 bits à partir de votre mot de passe et du sel, puis divisez-la en deux clés de 128 bits (k2, k3).
    • Assurez-vous que la sortie native de votre algorithme est d'au moins 256 bits, sinon cela sera lent. PBKDF2 - SHA256 est un bon choix. N'utilisez pas deux algorithmes séparés pour cela, car cela rendra les choses plus lentes et plus compliquées pour vous, mais ne ralentira pas un attaquant.
    • Si votre mot de passe a déjà une entropie suffisamment élevée, vous pouvez vous permettre d'utiliser un nombre d'itérations assez faible. 1000 itérations seront si rapides que vous ne le remarquerez même pas (d'autant plus que vous n'aurez qu'à décrypter la clé au démarrage du programme), il n'y a donc pas beaucoup de raisons d'aller en dessous. Si votre mot de passe est plus faible, vous pouvez augmenter le nombre d'itérations pour compenser.
    • Je ne recommande pas d'utiliser bcrypt pour cela, car sa sortie est de mauvaise taille et vous devrez la hacher à nouveau, ce qui ajoute une complexité inutile.
    • Je pense que scrypt peut générer une sortie de taille arbitraire, donc ce serait un bon choix s'il est disponible (cela peut ne pas être autorisé si vous le souhaitez FIPS conformité).
  3. Utilisez k2 pour AES crypter k1 en utilisant l'IV aléatoire.
  4. Enregistrez la clé cryptée, k3, le sel et l'IV dans un fichier quelque part.

Cryptage/décryptage:

  1. Utilisez PBKDF2 + votre mot de passe et le sel du fichier pour régénérer k2 et k3.
  2. Vérifiez k3. S'il ne correspond pas, soit votre mot de passe est erroné, soit quelqu'un a falsifié votre fichier. Arrêtez ici.
  3. Utilisez k2 et IV du fichier pour déchiffrer k1.
  4. Utilisez k1 pour crypter ou décrypter des fichiers.

Changement de mot de passe

  1. Déchiffrez k1 comme dans la section Chiffrement/Déchiffrement .
  2. Suivez les étapes de Configuration , en utilisant le même k1, mais régénérez tout le reste (nouveau sel aléatoire et IV, générez k2 et k3 à partir du nouveau mot de passe).

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.

10
Brendan Long

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.

6
nerdybeardo