Question

Qu'est-ce qu'un bon système de cryptage simple pour protéger les mots de passe dans une base de données ?Je n’ai pas nécessairement besoin de quelque chose d’hyper-sécurisé ni de quelque chose de rapide comme l’éclair, mais ces choses seraient bien.Avant tout, je veux juste quelque chose de facile à mettre en œuvre sans être terriblement lent ou peu sûr.

Était-ce utile?

La solution

Comme le dit MK, SHA1 ou MD5 sont les standards, avec SHA2.


Mise à jour:À mesure que les processeurs sont devenus plus rapides au fil des années, les hachages sont devenus plus faciles à forcer.Il est désormais recommandé d'utiliser bcrypt.


Ce que vous souhaitez est plus généralement appelé fonction de hachage cryptographique.Les hachages cryptographiques sont conçus pour être unidirectionnels (étant donné le hachage résultant, vous ne devriez pas pouvoir dériver l'entrée d'origine).De plus, la probabilité que deux chaînes arbitraires aient le même hachage (appelée collision de hachage) devrait être faible (idéalement 1/nombre de valeurs de hachage).

Malheureusement, ce n’est pas parce que vos mots de passe sont hachés que vous devez faire de gros efforts pour protéger les versions hachées.Beaucoup trop de personnes utilisent des mots de passe faibles qui seraient vulnérables à une attaque par force brute hors ligne.

Edit - plusieurs personnes ont également déjà souligné l'importance d'utiliser un sel.Un sel est une valeur constante que vous mélangez à l'entrée avant d'utiliser la fonction de hachage.Le fait de disposer d'un sel unique empêche les attaquants hors ligne d'utiliser des tables précalculées de mots de passe courants (tables arc-en-ciel) pour forcer vos mots de passe encore plus rapidement.

Autres conseils

MD5 ou SHA1 + sel.

Si vous utilisez MD5 ou SHA1, utilisez un sel pour éviter les hacks de la table arc-en-ciel.

En C#, c'est simple :

MD5CryptoServiceProvider hasher = new MD5CryptoServiceProvider();
string addSalt = string.Concat( "ummm salty ", password );
byte[] hash = hasher.ComputeHash( Encoding.Unicode.GetBytes( addSalt ) );

Facile: BCrypte.

celui de Jeff Vous stockez probablement les mots de passe de manière incorrecte l'article est une excellente lecture sur ce sujet.

C'était un de mes problèmes il y a quelques semaines.Nous déployions un vaste projet MIS dans 975 emplacements géographiques différents où notre propre magasin d'informations d'identification utilisateur sera utilisé comme authentifiant pour différents ensembles d'applications déjà implémentées et utilisées.Nous avons déjà fourni un service d'authentification basé sur REST et SOAP, mais le client a insisté pour pouvoir accéder au magasin d'informations d'identification de l'utilisateur à partir d'autres applications avec simplement une connexion DB pour une vue en lecture seule de la table ou de la vue associée.Soupir... (cette mauvaise décision de conception hautement couplée fait l'objet d'une autre question).

Cela nous a obligés à convertir notre système de stockage de mots de passe salés et hachés de manière itérative en une spécification et à fournir des implémentations linguistiques différentes pour une intégration facile.

Nous l'avons appelé mots de passe hachés assez sécurisés ou FSHP en bref.Je l'ai implémenté en Python, Ruby, PHP5 et je l'ai publié dans le domaine public.Disponible pour être consommé, fourchu, flambé ou craché sur GitHub à l'adresse http://github.com/bdd/fshp

FSHP est une implémentation de hachage de mot de passe salé et haché de manière itérative.

Le principe de conception est similaire à PBKDF1 spécification dans la RFC 2898(alias:PKCS #5 :Spécification de cryptographie basée sur mot de passe version 2.0.)Le FSHP permet de choisir la longueur du sel, le nombre d'itérations et la fonction de hachage cryptographique sous-jacente parmi SHA-1 et SHA-2 (256, 384, 512).Le préfixe méta auto-défini au début de chaque sortie le rend portable tout en permettant au consommateur de choisir sa propre base de sécurité de stockage de mot de passe.

SÉCURITÉ:

FSHP1 par défaut utilise des sels de 8 octets, avec 4 096 itérations de hachage SHA-256.- 8 octets Sel Rend les attaques de table arc-en-ciel impraticables en multipliant l'espace requis avec 2 ^ 64.- 4096 itérations rendent les attaques par force brute assez coûteuses.- Il n'y a aucune attaque connue contre le SHA-256 pour trouver des collisions avec un effort de calcul de moins de 2 ^ 128 opérations au moment de cette version.

IMPLÉMENTATIONS :

  • Python:Testé avec 2.3.5 (avec hashlib), 2.5.1, 2.6.1
  • Rubis :Testé avec 1.8.6
  • PHP5 :Testé avec 5.2.6

Tout le monde est plus que bienvenu pour créer des implémentations linguistiques manquantes ou polir les actuels.

OPÉRATION DE BASE (avec Python):

>>> fsh = fshp.crypt('OrpheanBeholderScryDoubt')
>>> print fsh
{FSHP1|8|4096}GVSUFDAjdh0vBosn1GUhzGLHP7BmkbCZVH/3TQqGIjADXpc+6NCg3g==
>>> fshp.validate('OrpheanBeholderScryDoubt', fsh)
True

PERSONNALISATION DE LA CRYPTE :

Affaiblissons notre système de hachage de mot de passe.- Diminuez la longueur du sel de 8 par défaut à 2.- Diminuer le tour d'itération de 4096 par défaut à 10.- Sélectionnez FSHP0 avec SHA-1 comme algorithme de hachage sous-jacent.

>>> fsh = fshp.crypt('ExecuteOrder66', saltlen=2, rounds=10, variant=0)
>>> print fsh
{FSHP0|2|10}Nge7yRT/vueEGVFPIxcDjiaHQGFQaQ==

Utilisez le SHA algorithme de hachage à sens unique avec un sel unique.C'est le principal algorithme que j'utilise pour stocker mes mots de passe dans la base de données.

Si vous utilisez SQL Server, il existe la fonction HashBytes :

http://msdn.microsoft.com/en-us/library/ms174415.aspx

J'appuie le vote pour MD5 ou SHA avec un sel.Tous les principaux langages de développement Web ont des fonctions intégrées pour calculer le hachage (en PHP, par exemple, le package mcrypt contient les fonctions nécessaires).

Vous devez utiliser un algorithme de hachage unidirectionnel comme SHA-1 suggéré ci-dessus avec un sel.Je suggère ce site pour plus d'informations.Il comprend quelques exemples de code/implémentation.http://www.obviex.com/samples/hash.aspx

Je pense que la clé d’une meilleure sécurité est d’utiliser des sels dynamiques.Cela signifie que vous générez une chaîne aléatoire pour chaque nouvel utilisateur et utilisez cette chaîne pour saler le hachage.Bien entendu, vous devez stocker ce sel dans la base de données pour pouvoir vérifier le mot de passe ultérieurement (je ne le crypte en aucun cas).

Pour un cryptage irréversible, j'opterais certainement pour SHA256 ou SHA1.MD5 a maintenant pas mal de collisions et beaucoup d'efforts ont été déployés pour le briser, donc ce n'est pas un bon modèle à utiliser.

Si vous souhaitez pérenniser votre solution, je vous recommande SHA256 ou SHA512.Le monde des geeks cryptographiques s'inquiète à propos de MD5 et, dans une moindre mesure, de SHA1.

Ou, si vous le pouvez, attendez SHA-3

J'ai remarqué beaucoup de confusion sur la façon de hacher correctement les mots de passe, en particulier sur stackoverflow.J'ai donc écrit une page qui devrait tout clarifier.Il y a un peu plus que l'utilisation d'un simple hachage.

Plus d'informations: Comment effectuer correctement le hachage de mot de passe

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