2009-11-30 4 views
15

J'ai une application Web java utilisant un cadre à ressort et un ressort de sécurité pour sa connexion. Dans ma base de données, mes mots de passe sont cryptés sur MD5 avant d'être sauvegardés. J'ai ajouté dans ma demande-config.xml ce codeSpring Security Encrypt MD5

<security:authentication-provider> 
<security:password-encoder hash="md5"/> 
<security:jdbc-user-service 
     data-source-ref="dataSource" 
     users-by-username-query="select user_name username, user_password password, 1 enabled from users where user_name=?" 
     authorities-by-username-query="select username, authority from authorities where username=?" /> 
</security:authentication-provider> 

Au début, il a travaillé lorsque le mot de passe dans le db n'a pas été chiffré. Mais quand je l'ai crypté et ajouté cet extrait dans ma configuration d'application

 <security:password-encoder hash="md5"/> 

Je ne peux pas me connecter.

+7

md5 est une fonction de hachage, pas une méthode de cryptage. – u0b34a0f6ae

+1

que voulez-vous dire? Qu'est-ce que je devrais avoir fait – cedric

Répondre

6

Comment créez-vous vos hachages MD5? Quelque chose comme les œuvres suivantes bien en Java:

MessageDigest messageDigest = MessageDigest.getInstance("MD5"); 
messageDigest.update(user.getPassword().getBytes(),0, user.getPassword().length()); 
String hashedPass = new BigInteger(1,messageDigest.digest()).toString(16); 
if (hashedPass.length() < 32) { 
    hashedPass = "0" + hashedPass; 
} 

Lorsque vous codez « koala » vous obtenez « a564de63c2d0da68cf47586ee05984d7 »?

+0

ah ok .. j'ai raté le 16 dans messageDigest.digest()). ToString (16). Merci – cedric

+0

effectivement, il peut y avoir moins de 31 symboles. alors. cela ne fonctionnera pas dans certaines situations (très rare). vous devez ajouter "0" tant que vous n'avez pas 32 symboles –

4

Avez-vous lu la section 6.3.3 Hashing and Authentication du manuel de référence de Spring Security? Il a mentionné quelques problèmes possibles que vous pourriez rencontrer lors de l'utilisation du hachage par mot de passe.

Quelques possibilités qu'il énumère:

  • Base de données de hachage de mot de passe est peut-être en base64, alors que le résultat de MD5PasswordEncoder est dans les chaînes hexadécimaux
  • Votre hachage de mot de passe est peut-être en majuscules, alors que le résultat de la l'encodeur est en minuscules
47

Je me rends compte que c'est un peu tard, mais Spring a des classes intégrées qui facilitent beaucoup la tâche.

@Test 
public void testSpringEncoder() { 
    PasswordEncoder encoder = new Md5PasswordEncoder(); 
    String hashedPass = encoder.encodePassword("koala", null); 

    assertEquals("a564de63c2d0da68cf47586ee05984d7", hashedPass); 
} 

Ceci est un test de l'unité que je l'ai écrit en utilisant le haut dans le code de sécurité du printemps, il est beaucoup plus petit que le code MessageDigest et puisque vous utilisez Spring Security déjà, vous devriez avoir les classes dans votre classpath déjà .

+2

Ceci est la meilleure réponse. Propre et facile avec le printemps. –

+1

Voici [une autre réponse] (http://stackoverflow.com/questions/7378107/hashing-and-salting-passwords-with-spring-security-3) avec un peu plus de détails sur la façon de l'utiliser soigneusement dans votre application Spring . – chrisjleu