2009-10-01 7 views
5

J'écris un programme simple pour le cryptage de fichiers. Surtout comme un exercice académique, mais peut-être pour un usage sérieux futur. Tout le travail de levage est effectué avec des bibliothèques tierces, mais assembler les pièces de manière sécurisée reste un défi pour le non-cryptographe. Fondamentalement, j'ai à peu près tout fonctionne comme je le pense. J'utilise l'AES 128 bits pour le chiffrement avec une longueur de clé de 128 bits. Je veux que les utilisateurs puissent entrer des mots de passe de longueur variable, j'ai donc décidé de hacher le mot de passe avec MD5 et ensuite utiliser le hachage comme clé. J'ai pensé que c'était acceptable - la clé est toujours supposée être un secret, donc il n'y a aucune raison de s'inquiéter des attaques par collision.L'utilisation de MD5 pour générer une clé de chiffrement à partir du mot de passe?

Maintenant que j'ai implémenté ceci, j'ai parcouru quelques articles indiquant que c'est une mauvaise idée. Ma question est: pourquoi? Si un bon mot de passe est choisi, le chiffrement est supposé être suffisamment fort pour ne jamais révéler la clé sauf par un effort de force brute extraordinaire (lire: actuellement impossible), n'est-ce pas? Devrais-je utiliser quelque chose comme PBKDF2 pour générer la clé ou est-ce juste trop pour toutes les applications cryptographiques les plus extrêmes?

+1

salt le mot de passe – helloandre

Répondre

4

Cet article sur Key strengthening pourrait vous aider. Fondamentalement, vous voulez rendre la clé plus forte (plus d'entropie que dans un mot de passe) et faire en sorte que sa dérivation du mot de passe prenne du temps.

+0

Merci, c'est exactement ce que je cherchais. – Charles

1

Eh bien, en tant que votre poste est en général, je voudrais dire quelques choses générales:

  1. MD5, SHA-0, SHA-1 sont tous hash cassés, et vous ne devriez pas les utiliser pour tout cryptographique but, utilisez SHA-2. Vous devriez, en général, utiliser des approches bien connues et documentées pour dériver les clés des mots de passe (vous ne mentionnez pas quelle langue, veuillez dire laquelle vous utilisez). Lorsque vous effectuez une programmation de sécurité, la chose la plus importante à faire est de documenter strictement votre «modèle de menace» avant de faire quoi que ce soit. Ceci est essentiellement une liste de toutes les attaques que vous essayez d'empêcher, et comment vous allez le faire, et aussi quelles sortes d'attaques vous ne pouvez pas empêcher. C'est très amusant à faire, et vous apprendrez à connaître toutes les attaques et autres choses intéressantes.

+1

1. Les vulnérabilités dans MD5 n'ont pas d'importance pour moi car Je ne l'utilise que pour dériver une clé d'une chaîne de longueur variable.Si un adversaire obtient le hasch, le jeu est fini puisque c'est ce qui était censé être le secret tout le long. Les attaques par collision n'entrent même pas en jeu ici, autant que je sache. 2. Voici ce que j'essaie de faire en posant la question ci-dessus. :) Le langage de programmation n'a pas d'importance parce que c'est une question de théorie, pas de mise en œuvre. Mais au cas où vous êtes simplement curieux, j'utilise Python. 3. C'est aussi ce que j'essaie de faire ici. :) – Charles

+0

Mec, je ne pense pas que tu lis ce que j'écris. :) – Charles

+0

Charles, soyeux a raison. N'utilisez aucun des hashes qu'il mentionne. Si vous posez les questions que vous êtes, vous ne comprenez pas les implications d'une fonction de hachage compromise (je ne prétends pas faire non plus). Allez lire http://www.daemonology.net/blog/2009-06-11-cryptographic-right-answers.html – lambacck

0

La réponse à votre nouvelle question est: vous devriez certainement utiliser quelque chose comme PBKDF2 pour générer la clé.

Je suppose que vous allez avoir un mot de passe (au moins 10 caractères plus bas et la ponctuation à droite?) Qui va générer une clé AES-256. La clé sera utilisée pour crypter/décrypter le (s) fichier (s). Vous voulez utiliser quelque chose comme PBKDF2 afin de réduire la capacité de quelqu'un qui obtient votre fichier à comprendre votre clé/mot de passe par le biais d'attaques par force brute. Utiliser quelque chose comme PBKDF2 (et un sel aléatoire!) Augmente le coût de rupture du cryptage sur le fichier.

Ce que je vraiment recommande est que vous l'utiliser comme un jouet et pas pour protéger vous vraiment quelque chose. Si vous n'êtes pas un expert en sécurité, vous allez faire des erreurs, même les experts (et beaucoup d'entre eux ensemble) font des erreurs: http://www.sslshopper.com/article-ssl-and-tls-renegotiation-vulnerability-discovered.html

+0

Merci pour les conseils. J'ai fait beaucoup plus de recherches après avoir posé cette question et j'ai fini par implémenter PBKDF2. La majeure partie du travail de levage est effectuée par des bibliothèques écrites par des personnes beaucoup plus intelligentes que moi-même. Cela mis à part, je dois commencer quelque part et quelle meilleure façon de s'assurer que mon programme est correct que de le faire protéger (espérons-le) mes propres données? Je suis bien conscient des risques de rouler ma propre solution ici et de les accepter pleinement. Si je termine le projet, j'espère le sortir en tant que logiciel open source afin que d'autres puissent scruter le code, ajouter des corrections, et éventuellement humilier publiquement mon travail. :) – Charles

Questions connexes