J'ai besoin de hacher les mots de passe pour le stockage dans une base de données. Comment puis-je faire cela en Java?
J'espérais prendre le mot de passe en texte brut, ajouter un sel aléatoire, puis stocker le sel et le mot de passe haché dans la base de données.
Ensuite, lorsqu'un utilisateur voulait se connecter, je pouvais prendre son mot de passe soumis, ajouter le sel aléatoire à partir des informations de son compte, le hacher et voir s'il correspond au mot de passe de hachage stocké avec les informations de son compte.
java
passwords
cryptographic-hash-function
Chris Dutrow
la source
la source
Réponses:
Vous pouvez en fait utiliser une fonction intégrée au runtime Java pour ce faire. Le SunJCE dans Java 6 prend en charge PBKDF2, qui est un bon algorithme à utiliser pour le hachage de mot de passe.
Voici une classe d'utilitaire que vous pouvez utiliser pour l'authentification par mot de passe PBKDF2:
la source
BigInteger
: les zéros non significatifs sont supprimés. C'est correct pour un débogage rapide, mais j'ai vu des bogues dans le code de production à cause de cet effet.Voici une implémentation complète avec deux méthodes faisant exactement ce que vous voulez:
Le fait est que même si un attaquant accède à la fois à votre base de données et au code source, les mots de passe sont toujours sûrs.
Nous stockons
'salt$iterated_hash(password, salt)'
. Le sel est composé de 32 octets aléatoires et son but est que si deux personnes différentes choisissent le même mot de passe, les mots de passe stockés seront toujours différents.Le
iterated_hash
, ce quihash(hash(hash(... hash(password, salt) ...)))
rend fondamentalement très coûteux pour un attaquant potentiel qui a accès à votre base de données de deviner les mots de passe, de les hacher et de rechercher des hachages dans la base de données. Vous devez calculer celaiterated_hash
chaque fois qu'un utilisateur se connecte, mais cela ne vous coûte pas beaucoup par rapport à l'attaquant qui passe près de 100% de son temps à calculer des hachages.la source
char[] password
place deString password
.BCrypt est une très bonne bibliothèque, et il existe un portage Java .
la source
Vous pouvez utiliser l' implémentation de la bibliothèque Shiro (anciennement JSecurity ) de ce qui est décrit par OWASP .
Il semble également que la bibliothèque JASYPT dispose d'un utilitaire similaire .
la source
Vous pouvez calculer les hachages en utilisant
MessageDigest
, mais c'est faux en termes de sécurité. Les hachages ne doivent pas être utilisés pour stocker les mots de passe, car ils sont facilement cassables.Vous devez utiliser un autre algorithme comme bcrypt, PBKDF2 et scrypt pour stocker vos mots de passe. Regardez ici .
la source
En plus de bcrypt et PBKDF2 mentionnés dans d'autres réponses, je recommanderais de regarder scrypt
MD5 et SHA-1 ne sont pas recommandés car ils sont relativement rapides, donc en utilisant un calcul distribué "loyer à l'heure" (par exemple EC2) ou un GPU haut de gamme moderne, on peut "cracker" des mots de passe en utilisant des attaques par force brute / dictionnaire à des coûts relativement bas et raisonnables temps.
Si vous devez les utiliser, effectuez au moins une itération de l'algorithme un nombre de fois significatif prédéfini (1000+).
Voir ici pour plus d'informations: /security/211/how-to-securely-hash-passwords
Et ici: http://codahale.com/how-to-safely-store-a-password/ (critique la famille SHA, MD5, etc. à des fins de hachage de mot de passe)
la source
Tout à fait d'accord avec Erickson que PBKDF2 est la réponse.
Si vous n'avez pas cette option, ou si vous avez seulement besoin d'utiliser un hachage, Apache Commons DigestUtils est beaucoup plus facile que d'obtenir le bon code JCE: https://commons.apache.org/proper/commons-codec/apidocs/org/apache /commons/codec/digest/DigestUtils.html
Si vous utilisez un hachage, utilisez sha256 ou sha512. Cette page contient de bonnes recommandations sur la gestion et le hachage des mots de passe (notez qu'elle ne recommande pas le hachage pour la gestion des mots de passe): http://www.daemonology.net/blog/2009-06-11-cryptographic-right-answers.html
la source
Vous pouvez utiliser Spring Security Crypto (n'a que 2 dépendances de compilation facultatives ), qui prend en charge le cryptage des mots de passe PBKDF2 , BCrypt , SCrypt et Argon2 .
la source
Bien que la recommandation du NIST PBKDF2 ait déjà été mentionnée, je tiens à souligner qu'il y a eu un concours de hachage de mot de passe public qui s'est déroulé de 2013 à 2015. En fin de compte, Argon2 a été choisi comme fonction de hachage de mot de passe recommandée.
Il existe une liaison Java assez bien adoptée pour la bibliothèque d'origine (C native) que vous pouvez utiliser.
Dans le cas d'utilisation moyen, je ne pense pas qu'il soit important du point de vue de la sécurité si vous choisissez PBKDF2 sur Argon2 ou vice-versa. Si vous avez des exigences de sécurité strictes, je vous recommande de considérer Argon2 dans votre évaluation.
Pour plus d'informations sur la sécurité des fonctions de hachage de mot de passe, consultez security.se .
la source
Ici, vous avez deux liens pour le hachage MD5 et d'autres méthodes de hachage:
API Javadoc: https://docs.oracle.com/javase/1.5.0/docs/api/java/security/MessageDigest.html
Tutoriel: http://www.twmacinta.com/myjava/fast_md5.php
la source
Parmi tous les schémas de hachage standard, LDAP ssha est le plus sûr à utiliser,
http://www.openldap.org/faq/data/cache/347.html
Je suivrais simplement les algorithmes spécifiés ici et utiliserais MessageDigest pour faire le hachage.
Vous devez stocker le sel dans votre base de données comme vous l'avez suggéré.
la source
À partir de 2020, l'algorithme le plus crédible et le plus flexible en usage,
celui qui est le plus susceptible d'optimiser sa solidité quel que soit le matériel,
est Argon2id ou Argon2i .
Il fournit l'outil d'étalonnage nécessaire pour trouver des paramètres de résistance optimisés en fonction d'un temps de hachage cible et du matériel utilisé.
Le hachage gourmand en mémoire aiderait à éviter l'utilisation du GPU pour le cracking.
L'implémentation de Spring security / Bouncy Castle n'est pas optimisée et relativement semaine compte tenu de ce que l'attaquant pourrait utiliser. cf: documentation Spring
L'implémentation la plus crédible utilisée pour java est celle de mkammerer ,
un jar / bibliothèque wrapper de l'implémentation native officielle écrite en Rust.
Il est bien écrit et simple à utiliser.
La version intégrée fournit des versions natives pour Linux, Windows et OSX.
À titre d'exemple, il est utilisé par jpmorganchase dans son projet de sécurité tessera utilisé pour sécuriser Quorum , son implémentation de cryptocurency Ethereum.
Voici l'exemple de code de tessera.
L'étalonnage peut être effectué à l'aide de de.mkammerer.argon2.Argon2Helper # findIterations
Les algorithmes SCRYPT et Pbkdf2 peuvent également être calibrés en écrivant un simple benchmark, mais les valeurs d'itérations sûres minimales actuelles nécessiteront des temps de hachage plus élevés.
la source
Je me suis appuyé sur une vidéo sur udemy et je l'ai modifié pour être un mot de passe aléatoire plus fort
la source