Sto facendo una web application di tipo monolitico in java con .jsp
nella pagina di registrazione utenti, nel controller, in fase di settaggio delle property dei campi che utilizzo nella form di registrazione, prima di eseguire il metodo che effettua la registrazione fisica del record nel database sql server, effettuo la criptazione della password.
l'operazione viene eseguita in maniera corretta
ecco il metodo che utilizzo
@RequestMapping(value = "/aggiungi", method = RequestMethod.POST)
public String GestInsAnadip(@Valid @ModelAttribute("userform") AnadipForm anadipForm, BindingResult result, Model model,
RedirectAttributes redirectAttributes, HttpServletRequest request)
{
String functionUser = "Inserimento";
if (result.hasErrors())
{
return "insAnadip";
}
// se non ho selezionato ne si e ne no in loggabile
if(anadipForm.getLoggabile() == null) {
return "insAnadip";
}
if (result.getSuppressedFields().length > 0)
throw new RuntimeException("ERRORE: Tentativo di eseguire il binding dei seguenti campi NON consentiti: "
+ StringUtils.arrayToCommaDelimitedString(result.getSuppressedFields()));
else
{
Anadip anadip = new Anadip();
// imposto i dati da AnadipForm
anadip.setCognome(anadipForm.getCognome().toUpperCase());
anadip.setKeyUserOp(9999); // inserire l'utente ceh ha effettuato la modifica - prenderlo da utente corrente
anadip.setLoggabile(anadipForm.getLoggabile());
anadip.setMatricola(anadipForm.getMatricola());
anadip.setNome(anadipForm.getNome().toUpperCase());
anadip.setNoteanag(anadipForm.getNoteanag());
anadip.setUserid(anadipForm.getUserid().toUpperCase());
anadip.setDateOp(date);
//CRITTIAMO LA PASSWORD
String encodedPassword = passwordEncoder.encode(anadipForm.getPassword());
anadip.setPassword(encodedPassword);
// inserisco le relazioni verso le tabelle correlate
T_Titolo ttit = new T_Titolo();
ttit = t_titoloService.SelByIdTitolo(anadipForm.getTitolo());
anadip.setTtitolo(ttit);
UserLevels ulev = new UserLevels();
ulev = userLevelsService.SelById(anadipForm.getUserlevel());
anadip.setUserlevels(ulev);
T_StatoUtente staut = new T_StatoUtente();
staut = t_statoUtenteService.SelByIdStatoUtente(anadipForm.getIdStato());
anadip.setTstatoutente(staut);
anadipService.Salva(anadip);
redirectAttributes.addFlashAttribute("saved", true);
return "redirect:/anadip/successAnadip/"+ anadip.getMatricola() + "/" + functionUser; // visualizza messaggio di corretta operatività - deve essere questo corrett
}
}
in fase di logon della web application, quando vado a impostare le credenziali dell'utente appena inserito, effettuo anche in questo caso la crittografia della password inserita nel form di login per effettuare una lettura delle credenziali e quindi verificare se utente registrato.
ecco il metodo che utilizzo nel controller
@RequestMapping(method = RequestMethod.POST)
public String getLoginPost(@ModelAttribute("userform") Anadip anadip,Model model,HttpServletRequest request, HttpServletResponse response)
{
// recupero i valori inseriti nel model
Anadip record = null;
if (anadip.getUserid() != null && anadip.getPassword() != null) {
//cripto LA PASSWORD
String encodedPassword = passwordEncoder.encode(anadip.getPassword());
record = anadipService.SelByUsernamePassword(anadip.getUserid(), encodedPassword);
if(record == null) {
System.out.println("-------GetLoginPost -- eseguita lettura senza record -------- userid: " + anadip.getUserid() + " password : " + anadip.getPassword());
}
else
{
System.out.println("-------GetLoginPost -- eseguita lettura -- record trovato -------- userid: " + anadip.getUserid() + " password : " + anadip.getPassword());
return "redirect:/";
}
}
String[] test = request.getParameterValues("logout");
if (test != null)
{
Cookie cookieWithSlash = new Cookie("JSESSIONID", null);
//Tomcat adds extra slash at the end of context path (e.g. "/foo/")
cookieWithSlash.setPath(request.getContextPath() + "/");
cookieWithSlash.setMaxAge(0);
Cookie cookieWithoutSlash = new Cookie("JSESSIONID", null);
//JBoss doesn't add extra slash at the end of context path (e.g. "/foo")
cookieWithoutSlash.setPath(request.getContextPath());
cookieWithoutSlash.setMaxAge(0);
//Remove cookies on logout so that invalidSessionURL (session timeout) is not displayed on proper logout event
response.addCookie(cookieWithSlash); //For cookie added by Tomcat
response.addCookie(cookieWithoutSlash); //For cookie added by JBoss
if (test.length == 2)
{
logger.info("utente: " + test[1]);
persistentTokenRepository.removeUserTokens(test[1]);
}
}
return "redirect:/login/form?logout";
}
quindi sia in fase di registrazione dell'utente che in fase di lettura delle credenziali d'accesso, sul campo password inserito dall'utente effettuo la crittografia utilizzando il metodo passwordEncoder.encode
String encodedPassword = passwordEncoder.encode(anadip.getPassword());
Ho verificato che lo stesso campo, eseguendo la criptazione più volte, crea dei valori criptati diversi ad ogni operazione.
in questo esempio effettuo per la password "paperino" scritta in minuscolo valori del tutto diversi
$2a$10$RkdWTFJ8F4ZnzFCT/cFjBOeneVY.1C1FZ1yeuVevFXySGsgoQ7Ywm paperino minuscolo
$2a$10$jAxq8ekwRB5m.e0InPHLEOPLQA5rWEV3ROPCgm3ET2YUbjp2bF./a paperino maiuscolo
$2a$10$3SUW8RfUbrD67am2Z6st7.n7zZI0DdsEGGhPoLS/05It5tISBgsuS paperino minuscolo
Non capisco perchè e come posso risolvere il problema.
Rimango a disposizione se non sono riuscito a spiegare in mnaiera chiara il problema.
Grazie
Moreno