Cryptage de mot de passe avec Spring/Hibernate - Jasypt ou autre chose? [fermé]
dans une pile D'applications Java avec Spring & Hibernate (JPA) dans la couche D'accès aux données, quelles sont les bonnes méthodes pour appliquer le cryptage du mot de passe (en utilisant des annotations, espérons), et où pouvez-vous en savoir plus sur la façon de le faire (tutoriel, etc)?
il est entendu que j'utiliserais un JCA algorithme supporté pour crypter les mots de passe, mais je préférerais ne pas avoir à implémenter la logique wrapper s'il y a un moyen facile.
je suis à la recherche à Jasypt, et a été) vous vous demandez si c'est une bonne option et comment le faire, et b) ce que les gens utilisent pour cela. Si Quelqu'un utilise Jasypt ou une alternative, les détails de votre expérience serait génial.
6 réponses
Java a toutes les bibliothèques nécessaires déjà fournies pour vous. Créez simplement une méthode utilitaire qui implémente le hachage avec un sel comme décrit à OWASP.
si vous ne voulez vraiment pas posséder ce code et que vous ne vous souciez pas d'une dépendance supplémentaire, il semble que le Shiro bibliothèque (anciennement JSecurity) a un mise en oeuvre de ce qui est décrit par OWASP.
on dirait aussi la bibliothèque JASYPT que vous avez mentionnée a un utilitaire similaire.
je me rends compte que cette réponse ne mentionne pas le printemps ou L'hibernation, mais je ne vois pas comment vous espérez les utiliser dans ce scénario.
Vous pouvez utiliser Jasypt avec Hibernate pour chiffrer ou hachez vos propriétés à la volée si c'est ce que vous cherchez. L'algorithme actuel de calcul des digests (hashes) est assez simple en utilisant le JCE si vous voulez rouler votre propre aussi bien.
MD5 ou SHA-256 serait très bien, bien que MD5 est crackable maintenant.
peut-être que j'ai mal compris le problème, mais il devrait être juste comparer les mots de passe hachés.
en hibernation, il suffit de stocker comme une ficelle. Du côté de la validation, avoir une méthode comme:
public validate(String user, String pass)
{
if(getUser(user).getPass().equals(getHash(pass)))
return true;
return false;
}
il ne semble pas y avoir de façon spécifique D'hiberner pour le faire avec Jasypt, mais vous pouvez configurer un Crypteur de mot de passe au printemps:
<!--
Set up string digester here so we can configure it for more pools if it's a problem...
-->
<bean id="stringDigester" class="org.jasypt.digest.PooledStringDigester">
<!-- same settings as StrongPasswordGenerator -->
<property name="poolSize" value="2"/>
<property name="algorithm" value="SHA-256"/>
<property name="iterations" value="100000"/>
<property name="saltGenerator">
<bean class="org.jasypt.salt.RandomSaltGenerator"/>
</property>
<property name="saltSizeBytes" value="16"/>
</bean>
<!-- ...and then we only have to deal with the passwordEncryptor interface in code. -->
<bean id="passwordEncryptor" class="com.myproject.util.StringPasswordEncryptor">
<property name="stringDigester" ref="stringDigester"/>
</bean>
après cela, vous appelez contexte.getBean ("passwordEncryptor") pour obtenir le crypteur, et ensuite appeler cryptpassword () ou checkPassword ().
si vous utilisez Spring dans votre application, alors vous pouvez aussi utiliser Sécurité De Printemps, qui vous fournit plusieurs encodeurs de mot de passe, i.e. ShaPasswordEncoder Vous pouvez le trouver sur StackOverflow
je viens de l'utiliser quelque chose de similaire à SHA-256(username + ":" + password + ":" + salt)
et le stocker dans la base de données dans une colonne de 64 caractères appelée passwd.
Wikipédia dit, concernant les sels: "le Sel de données complique les attaques de dictionnaire que l'utilisation de pré-chiffrement des entrées du dictionnaire: chaque bit de sel utilisé du double de la quantité de stockage et de calcul. ... Pour une meilleure sécurité, la valeur du sel est gardée secrète, séparée de la base de données des mots de passe. Cela fournit un avantage quand une base de données est volée, mais le sel est pas."
ainsi pour authentifier, obtenir l'utilisateur de la base de données avec le nom d'utilisateur fourni, puis générer le même hachage en utilisant le mot de passe fourni via leur tentative de connexion, et comparer à cela dans la base de données. Ajouter également une limite de vitesse pour les tentatives de connexion (par exemple, 5 par période de 5 minutes). Si l'utilisateur oublie son mot de passe, ne lui envoyez jamais le mot de passe (car vous ne l'aurez pas stocké), ni lui envoyer un nouveau mot de passe généré, mais envoyez-leur un lien pour changer ce mot de passe avec un mot de passe de changement key/nonce / salt dans L'URL que vous pouvez vérifier.