Question

Dans une pile d'applications Java avec Spring et Hibernate (APP) dans la couche d'accès aux données, quelles sont les bonnes méthodes d'application du cryptage par mot de passe (je l'espère à l'aide d'annotations), et où pouvez-vous en savoir plus sur l'obtenir fait (tutoriel, etc)?

Il est entendu que j'utiliser un algorithme pris en charge pour chiffrer les mots de passe, mais je préférerais ne pas avoir à mettre en œuvre la logique d'emballage s'il existe un moyen facile.

Je regardais Jasypt et étais) se demander si c'est une bonne option et comment le faire et b) ce que les gens utilisent d'autre pour cela. Si quelqu'un utilise Jasypt ou une alternative, les détails de votre expérience, il serait grand.

Était-ce utile?

La solution

Java a toutes les bibliothèques nécessaires sont déjà fournies pour vous. Il suffit de créer une méthode utilitaire qui implémente le hachage avec un sel tel que décrit à l'adresse OWASP .

Si vous ne voulez vraiment pas de posséder ce code et ne me dérange pas une dépendance supplémentaire, il semble que le la bibliothèque de Shiro (anciennement JSecurity ) a une la mise en œuvre de ce qui est décrit par OWASP.

Il ressemble également à la bibliothèque JASYPT vous avez mentionné a une utilitaire.

Je me rends compte que cette réponse ne mentionne pas du printemps ou en veille prolongée, mais je ne suis pas clair comment vous espérez les utiliser dans ce scénario.

Autres conseils

Vous pouvez utiliser Jasypt avec Hibernate pour crypter ou hachage vos propriétés à la volée si c'est ce vous cherchez. L'algorithme de calcul réel (digests hash) est assez simple en utilisant la JCE si vous voulez rouler votre propre bien.

MD5 ou SHA-256 serait bien, bien que MD5 est piratable maintenant.

Peut-être que j'ai mal compris le problème, mais il devrait être simplement comparer les mots de passe hachés.

Mise en veille prolongée, stocker tout comme une chaîne. Du côté de la validation, 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 être d'une manière spécifique Hibernate à faire avec Jasypt, mais vous pouvez configurer un mot de passe chiffreur 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 context.getBean ( "passwordEncryptor") pour obtenir le chiffreur, puis appelez soit EncryptPassword () ou checkPassword ().

Si vous utilisez Spring dans votre application, vous pouvez également utiliser printemps sécurité, qui vous fournit plusieurs codeurs de mot de passe, par exemple ShaPasswordEncoder Vous pouvez trouver sur StackOverflow

Je viens d'utiliser quelque chose de similaire à stocker et SHA-256(username + ":" + password + ":" + salt) dans la base de données dans une colonne de 64 caractères appelé passwd.

Wikipedia dit, relatif aux sels: « données sel complique les attaques de dictionnaire qui utilisent pré-cryptage des entrées du dictionnaire:. Chaque bit de sel utilisé double la quantité de stockage et de calcul nécessaire ... Pour une meilleure sécurité, la valeur de sel est gardé secret, séparé de la base de données de mots de passe. Ceci fournit un avantage lorsqu'une base de données est volée, mais le sel est pas ».

Donc, pour authentifier, obtenir la base de données utilisateur avec le nom d'utilisateur fourni, puis générer le même hachage en utilisant le mot de passe fourni par leur tentative de connexion, et comparer à celle de la base de données. Ajoutez également dans un certain taux limite pour les tentatives de connexion (par exemple, 5 par période de 5 minutes). Si l'utilisateur oublie son mot de passe, jamais les envoyer par courriel le mot de passe (comme vous ne l'aurez pas stocké), ni les envoyer par courriel un nouveau mot de passe généré, mais les envoyer par courriel un lien pour changer ce mot de passe avec une clé de mot de passe de changement / nonce / sel l'URL que vous pouvez vérifier contre.

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