Comment coder correctement le mot de passe à l'aide de ShaPasswordEncoder?
Je veux coder un mot de passe à l'aide de ShaPasswordEncoder
dans mon Printemps app.
ShaPasswordEncoder sha = new ShaPasswordEncoder(256);
sha.setIterations(1000);
String hash = sha.encodePassword(password, salt);
Mais je ne sais pas ce que je devrais mettre à salt param
. Peut-il être statique de la phrase (par exemple, sT4t1cPhr453), ou de la dynamique de la chaîne de différent pour chaque utilisateur (par exemple, nom d'utilisateur ou ID)?
Edit:
J'ai d'utilisateur personnalisé AuthenticationProvider
, de sorte que mon contexte de sécurité ressemble à:
<authentication-manager>
<authentication-provider ref="customAuthenticationProvider" />
</authentication-manager>
<beans:bean id="customAuthenticationProvider" class="com.app.cloud.auth.CustomAuthenticationProvider">
@Component("customAuthenticationProvider")
public class CustomAuthenticationProvider implements org.springframework.security.authentication.AuthenticationProvider {
@Autowired
private AuthService authService;
@Override
public Authentication authenticate(Authentication authentication)
throws AuthenticationException,BadCredentialsException {
//...
}
@Override
public boolean supports(Class<?> authentication) {
return authentication.equals(UsernamePasswordAuthenticationToken.class);
}
}
- Le hachage de mot de passe à l'aide de sha256 peut-être pas assez sécurisé. Vous pouvez avoir un coup d'oeil à ceci. Il fournit un mot de passe sécurisé de hachage (Java PBKDF2 Hachage de Mot de passe) avec le code source.
- Que voulez-vous dire? Entendez-vous d'utiliser le Printemps contexte de sécurité? Parce que je suis à l'aide personnalisée
AuthenticationProvider
, donc je ne sais pas ajouter un mot de codeur pour mon contexte de sécurité. - Si vous utilisez le hachage de mot de passe de la classe dans le site web ci-dessus. Vous pouvez utiliser des AuthenticationProvider au Printemps de Sécurité comme ceci: <authentification-manager> <authentification de fournisseur de l'utilisateur-service-ref="userAuthenticationService"> <mot de passe de l'encodeur ref="pbkdf2PasswordEncoder" /> </authentification de fournisseur> </authentification manager->
- Et vous devez définir vos haricots dans vous de contexte de l'application: <bean id="pbkdf2PasswordEncoder" class="com.exemple.PBKDF2PasswordEncoder"/>
- Un salée de hachage avec SHA256 et 1000 itérations est absolument parfait. Ce qui vous fait penser qu'il pourrait ne pas être suffisamment sécurisé?
Vous devez vous connecter pour publier un commentaire.
Dans le cas où vous souhaitez définir explicitement le sel, vous pouvez définir le sel source:
Dynamique de sel (basé sur la propriété username)
Statique sel
Approche recommandée
Si vous utilisez le Printemps de Sécurité 3.1, l'approche recommandée serait d'aller pour bcrypt, cela génère automatiquement un sel et concatène il.
Vous pouvez générer le mot de passe utilisateur comme ceci:
<authentication-provider ref="customAuthenticationProvider"><password-encoder ref="bCryptPasswordEncoder"/></authentication-provider>
, mais ici, c'est conf. problème -authentication-provider element cannot have child elements when used with 'ref' attribute
name attr
avecid attr
dans la configuration.Le principe derrière le salage des hachages, c'est que vous n'êtes pas vulnérable à des rainbow tables. Si vous utilisez statique sel puis son possible (mais cher) pour quelqu'un de construire un arc-en-ciel de la table pour votre sel. Si les fruits sont sucrés, quelqu'un le fera.
Idéalement, votre sel doit être aléatoire (par exemple, l'utilisation d'octets à partir d'un
SecureRandom
) et doit être différent pour chaque utilisateur. Vous devez stocker le sel côtés le hachage de mot de passe, par exemple, si vous utilisez une table de base de données, puis tout simplement une colonne de sel.Les dernières versions de Printemps de Sécurité (3.1 et versions ultérieures) d'essayer de traiter le sel dans une automatique, transparente. Le mot de passe de l'encodeur va automatiquement générer de l'aléatoire, le sel et l'ajouter à la valeur de hachage au lieu de les stocker séparément (par exemple dans les différentes colonnes). Parce que les hachages et le sel ont une longueur fixe, il est facile de déterminer quelle partie des données est qui.