TL;DR
À ne pas faire
- Ne limitez pas les caractères que les utilisateurs peuvent entrer des mots de passe. Seuls les idiots ne ce.
- Ne pas limiter la longueur d'un mot de passe. Si vos utilisateurs veulent une phrase avec "supercalifragilisticexpialidocious" à elle, ne pas les empêcher de l'utiliser.
- Ne rangez jamais votre mot de passe utilisateur en texte clair.
- Jamais e-mail un mot de passe pour l'utilisateur sauf quand ils ont perdu le leur, et vous avez envoyé un temporaire.
- Ne jamais, jamais se connecter mots de passe en toute manière.
- Jamais de hachage des mots de passe avec SHA1 ou MD5 ou même SHA256! Moderne des craquelins peuvent dépasser 60 et 180 milliards de hachages/seconde (respectivement).
Faire
- Utilisation scrypt quand vous le pouvez; bcrypt si vous ne pouvez pas.
- Utilisation PBKDF2 si vous ne pouvez pas utiliser bcrypt ou scrypt, avec SHA2 les tables de hachage.
- Réinitialiser tous les mots de passe lorsque la base de données est compromise.
- Mettre en œuvre une raisonnable de 8 à 10 caractères minimum de longueur, plus besoin d'au moins 1 lettre majuscule, 1 minuscule, un chiffre et un symbole. Cela permettra d'améliorer l'entropie du mot de passe, à son tour, rend plus difficile à craquer. (Voir le "Ce qui fait un bon mot de passe?" pour le débat.)
Pourquoi hachage des mots de passe de toute façon?
L'objectif derrière le hachage des mots de passe est simple: empêcher les malveillants d'accéder à des comptes d'utilisateur par compromettre la base de données. Donc, le but de hachage de mot de passe est de dissuader un hacker ou cracker par leur coûte trop de temps ou d'argent pour calculer la plaine mots de passe en texte. Et le temps/coût sont les meilleurs moyens de dissuasion dans votre arsenal.
Une autre raison pour laquelle vous voulez un bon, solide hachage sur un des comptes d'utilisateur est de vous donner suffisamment de temps pour changer tous les mots de passe dans le système. Si votre base de données est compromise, vous aurez besoin de suffisamment de temps pour au moins verrouiller le système, si ce n'est de changer à chaque mot de passe dans la base de données.
Jeremiah Grossman, CTO de Whitehat Security, a déclaré sur son blog après une récente récupération de mot de passe que requis par la force brute bris de sa protection par mot de passe:
Il est intéressant de noter, en vivant de ce cauchemar, j'ai appris BEAUCOUP de choses que je ne savais pas à propos de craquage de mot de passe, de stockage, et de la complexité. J'ai appris à apprécier, pourquoi stockage de mot de passe est toujours tellement plus important que la complexité de mot de passe. Si vous ne savez pas comment votre mot de passe est stocké, puis tout ce que vous ne pouvez vraiment dépendre de la complexité. Ce pourrait être la connaissance commune à un mot de passe et chiffrement des pros, mais pour la moyenne InfoSec ou Web expert en Sécurité, j'en doute fortement.
(C'est moi qui souligne.)
Ce qui fait un bon mot de passe, de toute façon?
L'entropie. (Non pas que je souscris pleinement à Randall point de vue.)
En bref, l'entropie est combien la variation est dans le mot de passe. Lorsqu'un mot de passe est uniquement de lettres minuscules, c'est que de 26 caractères. Ce n'est pas une grande variation. Alpha-numérique les mots de passe sont mieux, avec 36 caractères. Mais de permettre aux majuscules et minuscules, avec des symboles, est à peu près 96 caractères. C'est beaucoup mieux que les lettres. Un problème est que, pour faire de nos mots de passe mémorable nous insérer les modèles qui réduit l'entropie. Oups!
Mot de passe de l'entropie est approchée facilement. À l'aide de la gamme complète de caractères ascii (environ 96 typable caractères) donne une entropie de 6,6 par personnage, qui à 8 caractères pour un mot de passe est encore trop faible (52.679 bits d'entropie) pour la sécurité de l'avenir. Mais la bonne nouvelle, c'est: plus les mots de passe et mots de passe avec des caractères unicode, vraiment, augmentation de l'entropie d'un mot de passe et de le rendre plus difficile à craquer.
Il n'y a plus de discussion de mot de passe d'entropie sur la Crypto StackExchange site. Une bonne recherche sur Google permet également de mettre en place un grand nombre de résultats.
Dans les commentaires, j'ai parlé avec @popnoodles, qui a souligné que l'application d'une stratégie de mot de passe de X de la longueur X de nombreuses lettres, des chiffres, des symboles, etc, peuvent réduire l'entropie par mettre le mot de passe système plus prévisible. Je suis d'accord. Randomess, comme véritablement aléatoire que possible, est toujours le plus sûr, mais moins mémorable solution.
Donc, autant que j'ai été en mesure de dire, rendre le monde meilleur mot de passe est un Catch-22. Son pas mémorable, trop prévisible, trop court, trop de caractères unicode (dur de taper sur un ordinateur Windows/Mobile), trop long, etc. Aucun mot de passe n'est vraiment assez bon pour nos fins, nous devons les protéger, comme s'ils étaient de Fort Knox.
Les meilleures pratiques
Bcrypt et scrypt sont les meilleures pratiques actuelles. Scrypt sera meilleure que celle de bcrypt dans le temps, mais il n'a pas vu l'adoption de la norme par Linux/Unix ou par des serveurs web, et n'a pas eu des examens en profondeur de son algorithme publié pour le moment. Mais encore, l'avenir de l'algorithme ne semblent prometteurs. Si vous travaillez avec Ruby il y a un scrypt bijou qui va vous aider, et Node.js a maintenant son propre scrypt paquet.
Je vous suggère fortement de lire la documentation de la fonction crypt (), si vous voulez comprendre comment utiliser bcrypt, ou de vous trouver un bon wrapper ou utiliser quelque chose comme PHPASS pour un plus de l'héritage de la mise en œuvre. Je recommande un minimum de 12 tours de bcrypt, si ce n'est de 15 à 18 ans.
J'ai changé d'avis sur l'utilisation de bcrypt quand j'ai appris que bcrypt utilise uniquement blowfish clés du calendrier, avec un coût variable mécanisme. Ce dernier vous permet d'augmenter le coût de la force brute d'un mot de passe par l'augmentation de blowfish est déjà cher clé de l'annexe.
Moyenne des pratiques
J'ai du mal à imaginer cette situation plus. PHPASS prend en charge le PHP 3.0.18 à travers 5.3, donc il est utilisable sur presque toutes les configurations imaginables-et doit être utilisé si vous ne savez pour certain que votre environnement prend en charge bcrypt.
Mais supposons que vous ne pouvez pas utiliser bcrypt ou PHPASS à tous. Alors, quoi?
Essayez une mise en œuvre de PDKBF2 avec le nombre maximum de tours que votre environnement/application/utilisateur de la perception ne peut tolérer. Le numéro le plus bas, je recommande est de 2500 tours. Aussi, assurez-vous d'utiliser hash_hmac() si elle est disponible, pour rendre l'opération plus difficile à reproduire.
Les Pratiques De L'Avenir
Venir en PHP 5.5 est une pleine protection par mot de passe de la bibliothèque qui fait abstraction de loin les douleurs de travailler avec bcrypt. Alors que la plupart d'entre nous sommes coincés avec PHP 5.2 et 5.3 dans la plupart des environnements, en particulier des hôtes, @ircmaxell a construit une couche de compatibilité pour la venue de l'API qui est compatible PHP 5.3.7.
La Cryptographie Recap & Avertissement
La puissance de calcul nécessaire pour réellement craquer un mot de passe haché n'existe pas. La seule façon pour les ordinateurs à "craquer" un mot de passe est de recréer et de simulation de l'algorithme de hachage utilisé pour le fixer. La vitesse de la table de hachage est linéairement liée à sa capacité à être brute forcé. Pire encore, la plupart des algorithmes de hachage peuvent être facilement mises en parallèle pour effectuer encore plus vite. C'est pourquoi coûteux programmes comme bcrypt et scrypt sont si importants.
Vous ne pouvez pas possible de prévoir toutes les menaces ou voies de l'attaque, et donc vous devez faire de votre mieux pour protéger vos utilisateurs à l'avant. Si vous ne le faites pas, alors vous pourriez même passer à côté du fait que vous avez été attaqué jusqu'à ce qu'il soit trop tard... et vous êtes responsable. Pour éviter cette situation, la loi paranoïaque pour commencer. Attaque de votre propre logiciel (interne) et de tenter de voler les informations d'identification utilisateur, ou de modifier de comptes d'autres utilisateurs ou d'accéder à leurs données. Si vous n'avez pas tester la sécurité de votre système, alors vous ne pouvez pas blâmer personne, mais vous-même.
Enfin: je ne suis pas un cryptographe. Tout ce que j'ai dit, c'est mon avis, mais je pense qu'il est basé sur le bon vieux sens commun ... et beaucoup de lecture. Rappelez-vous, être aussi paranoïaque que possible, de rendre les choses le plus dur de s'immiscer que possible, et puis, si vous êtes toujours inquiet, contactez un blanc-chapeau de pirate ou un cryptographe pour voir ce qu'ils disent au sujet de votre code/système.