Question

Quel est le moyen le plus rapide et le plus sécurisé de chiffrer les mots de passe (de préférence PHP), et quelle que soit la méthode que vous choisissez, est-il portable ?

En d’autres termes, si je migre ultérieurement mon site Web vers un autre serveur, mes mots de passe continueront-ils à fonctionner ?

La méthode que j'utilise maintenant, comme on m'a dit, dépend des versions exactes des bibliothèques installées sur le serveur.

Était-ce utile?

La solution

Si vous choisissez une méthode de cryptage pour votre système de connexion, la vitesse n'est pas votre amie. Jeff a eu une discussion avec Thomas Ptacek à propos des mots de passe et des conclusion était que vous deviez utiliser la méthode de cryptage la plus lente et la plus sécurisée que vous puissiez vous permettre.

Extrait du blog de Thomas Ptacek :
La vitesse est exactement ce que vous ne voulez pas dans une fonction de hachage de mot de passe.

Les systèmes de mots de passe modernes sont attaqués par des pirates de mots de passe incrémentiels.

Les crackers incrémentiels ne précalculent pas tous les mots de passe craqués possibles.Ils considèrent chaque hachage de mot de passe individuellement et alimentent leur dictionnaire via la fonction de hachage de mot de passe de la même manière que le ferait votre page de connexion PHP.Les crackers de table arc-en-ciel comme Ophcrack utilisent l'espace pour attaquer les mots de passe ;Les crackers incrémentiels comme John the Ripper, Crack et LC5 fonctionnent avec le temps :statistiques et calcul.

Le jeu d'attaque par mot de passe est marqué dans le temps nécessaire pour déchiffrer le mot de passe X.Avec les tables arc-en-ciel, ce temps dépend de la taille de votre table et de la rapidité avec laquelle vous pouvez la rechercher.Avec les crackers incrémentiels, le temps dépend de la rapidité avec laquelle vous pouvez exécuter la fonction de hachage du mot de passe.

Mieux vous optimisez votre fonction de hachage de mot de passe, plus votre fonction de hachage de mot de passe est rapide, plus votre système est faible.MD5 et SHA1, même les chiffrements par blocs conventionnels comme DES, sont conçus pour être rapides.MD5, SHA1 et DES sont des hachages de mots de passe faibles.Sur les processeurs modernes, les éléments de base du chiffrement brut comme DES et MD5 peuvent être découpés en bits, vectorisés et parallélisés pour rendre les recherches de mots de passe ultra-rapides.Les implémentations de FPGA Game-over ne coûtent que des centaines de dollars.

Autres conseils

Je suis avec Peter.Le développeur ne semble pas comprendre les mots de passe.Nous choisissons tous (et j'en suis coupable aussi) MD5 ou SHA1 parce qu'ils sont rapides.En y réfléchissant (parce que quelqu'un me l'a fait remarquer récemment), cela n'a aucun sens.Nous devrions choisir un algorithme de hachage stupidement lent.Je veux dire, à l'échelle des choses, un site très fréquenté hachera les mots de passe, quoi ?toutes les 1/2 minutes ?Peu importe si cela prend 0,8 seconde contre 0,03 seconde en termes de serveur ?Mais cette lenteur supplémentaire est énorme pour empêcher tous les types d’attaques par force brute courantes.

D'après mes lectures, bcrypt est spécialement conçu pour le hachage sécurisé des mots de passe.Il est basé sur Blowfish et il existe de nombreuses implémentations.

Pour PHP, consultez PHPPass http://www.openwall.com/phpass/

Pour tous ceux qui utilisent .NET, consultez BCrypt.NET http://derekslager.com/blog/posts/2007/10/bcrypt-dotnet-strong-password-hashing-for-dotnet-and-mono.ashx

Il convient de souligner que vous ne souhaitez pas Crypter le mot de passe, vous souhaitez hacher il.

Les mots de passe cryptés peuvent être déchiffrés, permettant à quelqu'un de voir le mot de passe.Le hachage est une opération à sens unique, de sorte que le mot de passe d'origine de l'utilisateur disparaît (cryptographiquement).


Quant à l'algorithme que vous devez choisir, utilisez celui standard actuellement accepté :

  • SHA-256

Et lorsque vous hachez le mot de passe de l'utilisateur, assurez-vous également de hacher d'autres fichiers indésirables avec celui-ci.par exemple.:

  • mot de passe: password1
  • sel: PasswordSaltDesignedForThisQuestion

Ajoutez le sel au mot de passe de l'utilisateur :

String s = HashStringSHA256("password1PasswordSaltDesignedForThisQuestion");

Quoi que vous fassiez, n’écrivez pas votre propre algorithme de chiffrement.Faire cela garantira presque (sauf si vous êtes un cryptographe) qu'il y aura une faille dans l'algorithme qui rendra son déchiffrage trivial.

Pensez à utiliser bcrypt il est utilisé dans de nombreux frameworks modernes comme Laravel.

Je ne recherche pas nécessairement le plus rapide mais un bon équilibre, certains des serveurs pour lesquels ce code est développé sont assez lents, le script qui hache et stocke le mot de passe prend 5 à 6 secondes à s'exécuter, et j'ai je l'ai réduit au hachage (si je commente le hachage, il s'exécute en 1 à 2 secondes).

Il n'est pas nécessaire que ce soit le PLUS sécurisé, je ne code pas pour une banque (pour le moment) mais je NE FERA PAS stocker les mots de passe sous forme de texte brut.

password_hash ( string $password , int $algo [, array $options ] ).(PHP 5 >= 5.5.0, PHP 7)

password_hash() crée un nouveau hachage de mot de passe en utilisant un algorithme de hachage unidirectionnel puissant.password_hash() est compatible avec crypt().Par conséquent, les hachages de mots de passe créés par crypt() peuvent être utilisés avec password_hash().

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top